MySQL строки манипулирования для подсчета значений в поле - PullRequest
2 голосов
/ 06 марта 2012

У меня есть эта строковая манипуляция

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

Дело в том, что я не могу изменить метод храненияэтого компонента.Есть способ подсчитать точное количество валют в поле, игнорируя последнее «пустое» значение после последнего разделителя «*»?Как я могу изменить мои манипуляции со строками?

С ума сойти, любая помощь будет очень и очень признательна!

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Приведенный выше запрос не учитывает пустую часть строки после последней *.Это даже не разделяет это вообще.Это просто говорит, что:

*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 для проверки, но все должно быть в порядке.

0 голосов
/ 06 марта 2012

Просто вычтите 1 из вычисленного значения, если оно больше 0.

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;

Но это ужасный способ манипулировать данными внутри столбца. Вы должны разложить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...