Как вернуть ноль, если не найдено совпадение (в противоположность функции нуль) - PullRequest
1 голос
/ 15 мая 2019

Я хочу получить значение NULL, если оба выражения не совпадают, например, NULLIF (EXP1, EXP2) вернет значение NULL, если то же самое, и вернет первое значение EX, если оно не одинаковое.

Я пытался с помощью подзапроса или создания функций, но мне нужен простой, легкий, стандартный выход.

select * from table
where service_type = 'X3' 
or (1 <> (select nvl(min(1),2) from table where service_type = 'X3') 
and service_type is null)

Этот запрос возвращает результат моего желания, но мне не нужно использовать подзапрос.

таблица содержит данные типа

service_type
------------
X4
X3
null

Я хочу получить, если значение service_type match X3 возвращает X3, но если оно не совпадает с X5, тогда возвращается ноль для совпадения с нулевой записью.

Когда service_type = 'X3'

service_type
------------
X3

Когда service_type = 'X5' или любой другой, например, 'X%', вернет ноль

service_type
------------
null

Ответы [ 2 ]

1 голос
/ 15 мая 2019

как насчет случая, когда

select case when service_type='x3' then service_type else null end
from table_name
0 голосов
/ 15 мая 2019

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

select t.*
from t
where t.service_type = :value or
      (t.service_type is null and
       not exists (select 1 from t t2 where t2.service_type = :value)
      );

Вы также можете использовать оконные функции:

select t.*
from (select t.*, count(*) over (partition by service_type) as cnt
      from t
      where service_type = :value or service_type is null
     ) t
where service_type = :value or
      (cnt = 0 and service_type is null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...