我有这个字符串操作
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”(对于exaple:prod_name_1,4种货币而不是3种)。这是因为外部组件存储以这种非连贯的方式复制数据(* usd * cad * euro *而不是* usd * cad * euro)。
关键是我无法更改此组件的存储方法。有一种方法可以计算字段中确切的货币数量,忽略最后一个'*'分隔符后面的最后一个“空白”值? 如何修改字符串操作?
变得疯狂,任何帮助都会非常非常感激!
答案 0 :(得分:1)
上面的查询不计算最终*之后字符串的空白部分。它根本没有分裂它。它只是说:
*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数据库来测试它,但它应该没问题。
答案 1 :(得分:0)
如果计算值大于0,则从计算值中减去1。
CREATE FUNCTION CountCurrencies(s VARCHAR(255), delim VARCHAR(3))
RETURNS INT
BEGIN
SET @n = (LENGTH(s) - LENGTH(REPLACE(s, delim, ''))) / LENGTH(delim);
IF @n > 0 THEN
RETURN @n - 1;
ELSE
RETURN 0;
END IF;
END
SELECT product, CountCurrencies(currencies, '*') FROM my_table;
但这是丑陋的方式,操纵列内的数据。你应该分解它。