MySql не нравится Regexp?
Я пытаюсь найти строки, где первый символ не является цифрой. У меня есть это:
SELECT DISTINCT(action) FROM actions
WHERE qkey = 140 AND action NOT REGEXP '^[:digit:]$';
Но я не уверен, как убедиться, что он проверяет только первый символ...
Ответы
Ответ 1
Ваше текущее регулярное выражение будет соответствовать значениям, состоящим только из одной цифры, а не только первого символа. Просто удалите $
с конца, что означает "конец значения". Он будет проверять только первый символ, если вы не сообщите ему, чтобы проверить больше.
^[:digit:]
будет работать, это означает "начало значения, за которым следует одна цифра".
Ответ 2
Сначала в вашем запросе есть небольшая ошибка. Это должно быть:
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, это, вероятно, не даст никакого заметного увеличения производительности, поэтому вы можете придерживаться более простого запроса.