Есть ли способ выбрать значение из поля с регулярным выражением? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть несколько таблиц с записями, загруженными с регулярными выражениями в качестве значений.

Пример:

table1

record1 - field1, field2, field3 = ^19[8-9][0-9]$    
record2 - field1, field2, field3 = ^20[0-1][0-9]$

Я хотел бы выбрать следующим образом:

select field1, field2 from table where field3 = '1980';  

record1 должен быть выбран с текущими значениями:

field1, field2

Я не нахожу функцию / параметр REGEXP, для которых я могу это сделать.

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Нечто подобное вам понадобится.

Запрос:
WITH data AS (SELECT 'Data for Row 1 Column 1' field1, 'Some random text' field2, '^19[8-9][0-9]$' REG FROM DUAL UNION SELECT 'Data for Row 2 Column 1' field1, 'Another random text' field2, '^20[0-1][0-9]$' REG FROM DUAL) SELECT field1, field2 FROM DATA WHERE REGEXP_COUNT('1999',REG) = 1;

Дайте мне знать, если у вас есть какие-либо вопросы.

0 голосов
/ 16 февраля 2019

Вы можете использовать оператор REGEXP для проверки входного параметра по каждому регулярному выражению, хранящемуся в столбце field3.REGEXP (что также можно записать RLIKE) доступно с ранних версий MySQL (5.5):

SELECT * FROM t WHERE '1980' REGEXP field3

Из документации:

expr REGEXP pat:Возвращает 1, если строка expr соответствует регулярному выражению, указанному шаблоном pat, в противном случае 0.Если expr или pat равен NULL, возвращаемое значение равно NULL.

Начиная с MySQL 8.0, REGEXP_LIKE() также может использоваться:

SELECT t1, t2 FROM mytable WHERE REGEXP_LIKE('1980', field3);

Демонстрация на DB Fiddle :

with t as (
  select  1 field1, 1 field2, '^19[8-9][0-9]$' field3
  UNION ALL select 2, 2, '^20[0-1][0-9]$'
)
SELECT * FROM t WHERE '1980' REGEXP field3;

| field1 | field2 | field3         |
| ------ | ------ | -------------- |
| 1      | 1      | ^19[8-9][0-9]$ |
0 голосов
/ 15 февраля 2019

Есть несколько способов справиться с этим.Одним из них является использование IN для сопоставления с любым списком:

SELECT ... FROM ... WHERE field3 IN (346, 868, 869, 28776)

Или для диапазонов использования BETWEEN:

SELECT ... FROM ... WHERE field3 BETWEEN 1980 AND 1999

Это только в случаях, когда действительная произвольная строка соответствует вамЯ хочу использовать регулярные выражения, например:

SELECT ... FROM ... WHERE field3 RLIKE '^XYZ-\d+$'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...