#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
получения этих значений. Вы забыли одно в этом списке, запись отсутствует.