Регулярное выражение приводит только к совпадению MySQL

#mysql #regex

#mysql #регулярное выражение

Вопрос:

Я пытаюсь получить только первые два слова в sql-запросе, я использую match: ^w{2}- но безуспешно, потому что ко мне ничего не приходит, мне нужно получить эти значения

BA, CE, DF, ES, GO, я не знаю, как я могу это сделать, ниже приведен пример данных.

 SCamp;Tipo=FM
SCamp;Tipo=Web
SCamp;Tipo=Comunitaria
RSamp;Tipo=Todas
RSamp;Tipo=AM
RSamp;Tipo=FM
RSamp;Tipo=Web
RSamp;Tipo=Comunitaria
BA-Salvadoramp;Tipo=12horas
CE-Fortalezaamp;Tipo=12horas
CE-Interioramp;Tipo=12horas
DF-Brasiliaamp;Tipo=12horas
ES-Interioramp;Tipo=12horas
ES-Vitoriaamp;Tipo=12horas
GO-Goianiaamp;Tipo=12horas
MG-ZonaDaMata/LestedeMinasamp;Tipo=12horas
MG-AltoParanaibaamp;Tipo=12horas
MG-BeloHorizonteamp;Tipo=12horas
MG-CentroOestedeMinasamp;Tipo=12horas
  

Запрос: SELECT * FROM tabel WHERE filter REGEXP '^w{2}-'

ПРАВКА РЕШЕНА:

Для решения запроса должно быть: SELECT SUBSTRING(column, 1, 2) AS column FROM table WHERE column REGEXP '^[[:alnum:]_]{2}-'

Комментарии:

1. Вы тоже пробовали SUBSTRING(<column>, 1, 2) ?

2. Но мне нужно сопоставить ^w{2}- это не соответствует, я делаю что-то не так в этом?

3. Понятия не имею, что вы не показывали запрос..

4. Используйте ^[[:alnum:]_]{2}- , или — если вам нужны две заглавные буквы, ^[[:upper:]]{2}_

Ответ №1:

MySQL не поддерживает символьный класс w or d . Вместо w вы должны использовать [[:alnum:]] . Вы можете найти все поддерживаемые классы символов в официальной документации MySQL.

Итак, вы можете использовать следующее решение, используя REGEXP :

 SELECT * 
FROM table_name 
WHERE filter REGEXP '^[[:alnum:]]{2}-'
  

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

 SELECT REGEXP_SUBSTR(filter, '^[[:alnum:]]{2}-') 
FROM table_name 
WHERE filter REGEXP '^[[:alnum:]]{2}-';
  

Или другое решение, использующее HAVING для фильтрации результата:

 SELECT REGEXP_SUBSTR(filter, '^[[:alnum:]]{2}-') AS colResult 
FROM table_name 
HAVING colResult IS NOT NULL; 
  

Чтобы получить значение до MySQL 8.0, вы можете использовать следующее с LEFT :

 SELECT LEFT(filter, 3) 
FROM table_name 
WHERE filter REGEXP '^[[:alnum:]]{2}-';
  

демонстрация: https://www.db-fiddle.com/f/7mJEmCkEiYhCYK3PcEZTNE/0

Комментарии:

1. Если я объединю оба ответа, результат будет там!! ха-ха, ВЫБЕРИТЕ SUBSTRING (столбец, 1, 2) В КАЧЕСТВЕ столбца Из таблицы, ГДЕ регулярное выражение столбца ‘^[[:alnum:]_]{2}-‘ работает отлично, спасибо!!!!

2. @OracyMartos вам лучше не объединять оба ответа, это означает, что требуется двойная обработка.. если вы используете SUBSTRING(<column>, 1, 2) в SELECT и WHERE , оно будет обработано один раз и кэшировано в MySQL для одной и той же записи, что означает, что вы экономите ценные циклы процессора для многих записей..

Ответ №2:

Использование SUBSTRING(<column>, 1, 2) также должно сработать..

Более или менее как показано ниже

 SELECT 
   <column>
 , SUBSTRING(<column>, 1, 2) 
FROM
 <table>
WHERE 
 SUBSTRING(<column>, 1, 2) IN ('BA' [,<value>..])
  

Некоторые вещи являются BNF (формой Backus-Naur) в коде SQL.

<..> означает заменить на то, что вам нужно.
[, ..] означает необязательное неограниченное повторение запятой в части синтаксиса SQL

Комментарии:

1. Если я объединю оба ответа, результат будет там!! ха-ха, SELECT SUBSTRING(column, 1, 2) AS column FROM table WHERE column REGEXP '^[[:alnum:]_]{2}-' работает отлично, спасибо!!!!

2. OracyMartos вам лучше не объединять оба ответа, это означает, что требуется двойная обработка.. если вы используете SUBSTRING(<column>, 1, 2) в SELECT и WHERE , оно будет обработано один раз и кэшировано в MySQL для одной и той же записи, что означает, что вы экономите ценные циклы процессора для многих записей.

3. Мне нужно получить эти значения — не работает с SUBSTRING . Вам нужно знать список для IN получения этих значений. Вы забыли одно в этом списке, запись отсутствует.