我有这个字符串操作
select product,
CAST((LENGTH(currencies) - LENGTH(REPLACE(currencies, '*', ''))) / LENGTH('*') AS UNSIGNED) AS currencies_count
from MY_TABLE
计算此表中单个字段中的“货币”
product currencies
----------- --------------
prod_name_1 *usd*cad*euro*
prod_name_2 *usd*cad*
prod_name_3 *usd*cad*euro*
prod_name_4
prod_name_5 *usd*
字符串操作在所有结果上返回“+1”(例如:prod_name_1,4 种货币而不是 3 种)。这是因为外部组件以这种非连贯方式存储复选框数据(*usd*cad*euro* 而不是 *usd*cad*euro)。
关键是我不能改变这个组件的存储方式。有一种方法可以计算字段中货币的确切数量,忽略最后一个“*”分隔符后的最后一个“空白”值? 如何修改我的字符串操作?
变得疯狂,任何帮助将非常非常感谢!
最佳答案
上面的查询不计算最后一个 * 之后的字符串的空部分。它甚至根本没有 split 它。它只是说:
*eur*usd*
比
长3个字符eurusd
要获得正确的值,我认为您应该检查一个空的货币值,如果找到则将结果设置为 0。否则结果是 * 符号的数量减去 1:
SELECT
CASE WHEN LENGTH(Currencies) = 0 THEN CAST(0 AS UNSIGNED)
ELSE CAST((LENGTH(Currencies) - LENGTH(REPLACE(Currencies, '*', ''))) / LENGTH('*') AS UNSIGNED) - 1 END AS currencies_count
FROM MY_TABLE
我没有 mysql 数据库来测试它,但它应该没问题。
关于MySQL 字符串操作以计算字段中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9581776/