2013-02-28 2 views
3

Существующая база данных содержит полевой запрос «depend_ages», а некоторые данные примера выглядят как «1,2,5» или «1yo и 3mo» или «4mo».Как подсчитать количество совпадений для данной строки в MySQL?

Требование состоит в том, чтобы преобразовать такую ​​строку в целое число, которое представляет собой число подстрок, разделенных символами «,» или «и». Точнее, разделитель можно описать как регулярное выражение «, | \ sand \ s». Итак, для приведенного выше примера конвертированные целые числа равны 3, 2 и 1. В основном меня интересует , сколько существует совпадений, а не значение из этих совпадений. Так что когда-либо индивидуальное значение «14yo» или «4MO», то он будет считаться 1.

Вопрос заключается в том, чтобы найти выражение MySQL, который может сделать это, например

SELECT REGEXMATCHES(dependent_ages) as dependent_no ... 

UPADTE

Некоторые ответы/комментарии показывают некоторое общее недоразумение в вопросе, поэтому я уточнил вопрос.

+0

Как данные примера приводят к целым числам 3, 2 и 1? –

+0

Естественные языки не являются регулярными и обычно не обрабатываются регулярным выражением. Тем не менее, вы можете использовать '\ d +' для извлечения всех indepedent номеров (поэтому из '14yr, 9yr' вы получите' 14' и '9'). Разумеется, нет разницы между 9 и 9 месяцами. – JDB

+1

@ Cyborgx37 Думаю, вы меня не поняли.Это поле описывает возраст детей для человека, и я хочу, чтобы это число его/ее детей. Таким образом, независимо от того, является ли возраст 14 лет или 14 месяцев или 15 лет, это не имеет значения, все они будут считаться 1 ребенком. –

ответ

0

Я думаю, что нужно что-то вроде этого:

SELECT 
    col, 
    CASE WHEN COALESCE(col, '')='' THEN 0 
    ELSE 
    length(col)-length(replace(col, ',', ''))+ 
    (length(col)-length(replace(col, ' and ', ''))) DIV 5 
    +1 
    END 
FROM 
    yourtable 

Пожалуйста, см скрипку here.

+0

Это умный ответ. Однако он не использует регулярное выражение, поэтому он работает только в этом примере. Что делать, если используются более сложные шаблоны? Во всяком случае, я ваш ответ. –

+0

А также этот сбой при вводе «Torand: 1yo, Tarkel: 3mo». Согласно данному регулярному выражению он должен вернуться 2. Ваш код возвращает 3. –

+0

@EarthEngine Я обновил свой ответ, теперь он работает на вашем входе. К счастью, поддержка MySql для регулярных выражений очень ограничена – fthiella

0

Если я правильно понял, это то, что вам нужно.

select count(*) from `table` where `dependent_ages` rlike 'HERE-REGEX' 
+0

Извините, вы меня не поняли * правильно *. –

+0

@ EarthEngine - Возможно, вы не очень хорошо спросили с первой попытки? Ваше обновление намного яснее. – JDB

1

На основе документации по MySQL string functions и Regular Expressions, я не думаю, что можно сделать что-либо большее, чем вернуть true (1) или false (0), используя сравнение регулярных выражений. Вы не можете вернуть совпадение, и вы не можете вернуть количество совпадений. Я не думаю, что вы даже можете использовать регулярное выражение для выполнения замены.

Вы можете быть в состоянии использовать Stored Program:

  • Начиная с: 'son: 10yr * daughter: 5yr * son:6mo'
  • First Pass: заменить все "*" в строке с "" ==>'son: 10yr daughter: 5yr son:6mo'
  • Второй проход: заменить последовательности номера с "*" (так "15" становится "*") ==>'son: *yr daughter: *yr son:*mo'
  • Третий проход: заменить не "*" с "" ==>'***'
  • Четвертый проход: верните длину строки (3).

Это было бы медленным и комбинированным для большого количества записей, но оно оставило бы вас в пределах MySQL. Вы также можете рассмотреть возможность использования другого инструмента для загрузки строк, выполнения вашей обработки и последующей загрузки результатов.

Смежные вопросы