MySql не похож на Regexp? - PullRequest
       4

MySql не похож на Regexp?

15 голосов
/ 05 апреля 2010

Я пытаюсь найти строки, где первый символ не является цифрой. У меня есть это:

SELECT DISTINCT(action) FROM actions 
WHERE qkey = 140 AND action NOT REGEXP '^[:digit:]$';

Но я не уверен, как убедиться, что он проверяет только первый символ ...

Ответы [ 2 ]

23 голосов
/ 05 апреля 2010

Сначала в вашем запросе есть небольшая ошибка. Должно быть:

NOT REGEXP '^[[:digit:]]'

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

REGEXP '^[^[:digit:]]'

Также обратите внимание, что использование REGEXP предотвращает использование индекса и приведет к сканированию таблицы или сканированию индекса. Если вы хотите более эффективный запрос, попробуйте переписать запрос, не используя REGEXP, если это возможно:

SELECT DISTINCT(action) FROM actions 
WHERE qkey = 140 AND action < '0'
UNION ALL
SELECT DISTINCT(action) FROM actions 
WHERE qkey = 140 AND action >= ':'

Затем добавьте индекс (qkey, action). Это не так приятно читать, но оно должно дать лучшую производительность. Если у вас есть только небольшое количество действий для каждого qkey, то это, вероятно, не даст заметного увеличения производительности, поэтому вы можете придерживаться более простого запроса.

11 голосов
/ 05 апреля 2010

Ваше текущее регулярное выражение будет соответствовать значениям, состоящим из ровно одной цифры , а не только первого символа.Просто удалите $ с конца, что означает «конец значения».Он будет проверять только первый символ, если вы не попросите его проверить больше.

^[:digit:] будет работать, что означает «начало значения, за которым следует одна цифра».

...