2012-03-27 3 views
0

У меня есть таблица mysql, которая имеет 2 столбца. Столбец 1 содержит строковое значение, а столбец 2 содержит количество раз, когда это значение строки произошло.Регулярное выражение в mySQL

Я пытаюсь найти строку abc.X.def, где начинается строка «abc.», За которой следует один или несколько символов, а затем строка «.def». После «.def» может быть больше символов.

Как найти такие строки, затем добавить появление таких строк и отобразить результаты?

Например, если у меня есть

abc.111.def23 1 
abc.111.def  2 
abc.22.def444 1 
abc.111.def  1 

Тогда я буду получать

abc.111.def23 1 
abc.111.def  3 
abc.22.def444 1 

Спасибо.

ответ

4

Я думаю, что вы можете использовать LIKE и SUM:

SELECT StringValue, SUM(InstanceSubCount) AS InstanceCount 
FROM ValueInstanceSubcounts 
WHERE StringValue LIKE 'abc.%.def%' 
GROUP BY StringValue 

Обратите внимание на предложение GROUP BY, так как ваша таблица не имеет первичного или уникального ключа в StringValue. Также обратите внимание на второй % после «def», так как ваши строковые значения не заканчиваются на «.def», но на самом деле могут иметь некоторые цифры после этого, казалось бы. Для этого, если ваши свободных символов всегда десятичные цифры ([0-9]), вы можете попробовать что-то вроде одного из этих WHERE статей вместо:

WHERE StringValue REGEXP '^abc\.\d+\.def\d*$' 
WHERE StringValue REGEXP '^abc\.[0-9]+\.def[0-9]*$' 

Они эквивалентны, и требуют несколько цифр между точками/периоды (это то, что делает плюс), и позволяют цифр после «def» (это то, что делает звездочка). Для самих периодов необходимо сбрасывать обратную косую черту, поскольку в противном случае они представляют любой символ. ^ и $ сообщают REGEXP, чтобы соответствовать полной строке, от начала до конца. Наконец, \d является сокращением десятичных цифр, которое также может быть представлено диапазоном символов [0-9].

1

Вы ищете предложение «LIKE», см. manual.

В этом разделе вы можете использовать % для соответствия любому количеству символов. Результирующий в:

SELECT * FROM table WHERE value LIKE 'abc.%.def%' 
+0

Это также разрешит 'value = 'abc.def'', поскольку вы объявляете только один' .' –

1

Я не вижу связи с регулярным выражением здесь действительно основанный на том, что у вас есть и что вы хотите. Это больше похоже на GROUP BY и SUM() случае:

SELECT str_example, SUM(number) 
FROM table_name 
GROUP BY str_example 

str_example бы АЗБУКА ... Защиту
number бы число, которое увеличивается в примере

Если вы хотите, чтобы регулярное выражение это:

WHERE str_example REGEXP '^abc\.\+?\.def.*$' 
Смежные вопросы