MySQL字符串操作来计算字段中的值

时间:2012-03-06 10:27:03

标签: mysql string count

我有这个字符串操作

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)。

关键是我无法更改此组件的存储方法。有一种方法可以计算字段中确切的货币数量,忽略最后一个'*'分隔符后面的最后一个“空白”值? 如何修改字符串操作?

变得疯狂,任何帮助都会非常非常感激!

2 个答案:

答案 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;

但这是丑陋的方式,操纵列内的数据。你应该分解它。