Выполнение нескольких значений LIKE в результате CASE WHEN SQL - PullRequest
0 голосов
/ 11 февраля 2019

Можно ли выполнить многозначный LIKE (LIKE "x" OR "y" ..) в результате CASE WHEN.

Чего я хотел бы достичь:

((CASE WHEN customerName IS NULL THEN "abc" ELSE "def" END) LIKE "a" OR "b" or "d")

Чего я бы хотел избежать:

((CASE WHEN customerName IS NULL THEN "abc" ELSE "def" END) LIKE "a") 
OR ((CASE WHEN customerName IS NULL THEN "abc" ELSE "def" END) LIKE "b") 
OR ((CASE WHEN customerName IS NULL THEN "abc" ELSE "def" END) LIKE "c")

Ответы [ 2 ]

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

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

'abc'
'qabc'
'ptestp'
'sometext'
'oneone'

Если вы хотите выбрать только те, которые содержат abc или test, вы можете выполнить следующий запрос:

SELECT * FROM (VALUES ('abc'),
                      ('qabc'),
                      ('ptestp'),
                      ('sometext'),
                      ('oneone'))
example_data(label)
WHERE label ~ 'abc|test';

При этом будут выбраны только следующие значения: abc, qabc, ptestp.

Помните, что оператор ~ принимает регулярное выражение справа, поэтому вы можете использовать любоетипы шаблонов (например, полное совпадение, совпадение в начале слова, в конце слова и т. д.).

Например, следующий запрос:

SELECT * FROM (VALUES ('abc'),
                      ('abcc'),
                      ('ptestp'),
                      ('sometext'),
                      ('oneone'))
example_data(label)
WHERE label ~ '^abc$|^test$';

Выберет толькопервая строка (abc), так как требует, чтобы слова полностью совпадали.

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

Вы можете присоединиться к основному запросу с помощью подзапроса.Проверьте это:

select customerName from 
(
  select 'fff' customerName union all
  select null
) customer
where exists ( 
  select 1 from
  (
    select 'a' x union all
    select 'b' union all
    select 'd'
  ) i
  where (CASE WHEN customerName IS NULL THEN 'abc' ELSE 'def' END) LIKE i.X || '%'
)
| customername |
| :----------- |
| fff          |
| <em>null</em>         |

db <> скрипка здесь

...