Выберите только строки с COLUMN = <value>, если совпадения существуют, или COLUMN IS NULL в противном случае - PullRequest
1 голос
/ 08 июля 2019

Вот пример сценария для демонстрации проблемы:

CREATE TABLE person (
  id NUMERIC PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  city VARCHAR(255)
);

INSERT INTO person(id, name, city) VALUES(1, 'John', 'New York');
INSERT INTO person(id, name, city) VALUES(2, 'Mike', 'Boston');
INSERT INTO person(id, name, city) VALUES(3, 'Ralph', NULL);

Для city='Boston' Я хочу, чтобы только была возвращена вторая строка.Для city='Chicago' я хочу вернуть 3-й ряд.

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Если вы ищете одну строку:

select p.*
from person p
where city is null or city = 'Boston'
order by (city = 'value') desc
fetch first 1 row only;

Если вы можете иметь несколько совпадений, то я бы предложил:

select p.*
from person p
where p.city = 'Boston'
union all
select p.*
from person p
where p.city is null and
      not exists (select 1 from person p2 where p2.city = 'Boston');

Или, используя оконные функции:

select p.*
from (select p.*, count(*) filter (where p.city = 'Boston') as cnt
      from person p
     ) p
where (cnt > 0 and p.city = 'Boston') or
      (cnt = 0 and p.city is null);
1 голос
/ 08 июля 2019

попробуйте, как показано ниже, используя подзапрос

select * from person
where 
   city='chicago' or 
  ( city is null and 
    1!=( select count(*) from person where city='chicago'  )
  )

демонстрационная ссылка

ID  NAME    CITY
3   Ralph   


select * from person
where 
   city='Boston' or 
  ( city is null and 
    1!=( select count(*) from person where city='Boston'  )
  )

результат с использованием Бостона

    ID  NAME    CITY
    2   Mike    Boston

Демонстрация с использованием Бостона

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...