SQL Запрос на поиск строки, соответствующей определенному шаблону - PullRequest
0 голосов
/ 17 июня 2020

У меня есть столбец varchar в таблице, и мне нужно найти все значения в столбце, соответствующие шаблону. Шаблон имеет следующий вид: parta-partb-part c или parta-partb-positiveInteger-part c. За исключением числовой части, все исправлено. Например,

**someColumn**

parta-partb-partc
parta-partb-1-partc
parta-partb-1xyz-partc
parta-partb-123-partc
parta-partb-abc-partc

Мой поисковый запрос должен возвращать

parta-partb-partc
parta-partb-1-partc
parta-partb-123-partc

Пока это то, что я получил

 SELECT * 
 FROM tableName 
 WHERE 
      someColumn ='parta-partb-partc' 
   OR someColumn LIKE 'parta-partb-%[0-9]-partc'

Я не могу построить часть LIKE чтобы получить только строки с положительным числом между ними.

1 Ответ

1 голос
/ 17 июня 2020

Для MySQL следующий запрос дает ожидаемый результат

SELECT *
FROM
  tableName
WHERE
   someColumn = 'parta-partb-partc'
   OR 
   someColumn REGEXP 'parta-partb-[0-9]+-partc'
;

Для Oracle следующий запрос дает ожидаемый результат

SELECT *
FROM tableName
WHERE
   someColumn = 'parta-partb-partc'
   OR 
   REGEXP_LIKE(someColumn, 'parta-partb-[[:digit:]]+-partc')
;

Для MS- SQL, к сожалению, REGEX не поддерживается в предложении where, поэтому вам нужно сделать что-то вроде следующего. [Укажите c на данные вашего примера]

SELECT *
FROM tableName
WHERE
   someColumn = 'parta-partb-partc'
   OR 
   (    someColumn LIKE 'parta-partb-[0-9]-partc'
    OR  someColumn LIKE 'parta-partb-[0-9]%[0-9]-partc'
    AND someColumn NOT LIKE 'parta-partb-[0-9]%[a-zA-Z]%[0-9]-partc'
    AND someColumn NOT LIKE 'parta-partb-[0-9]%[a-zA-Z]-partc'
   )
...