MySQL: сначала найдите указанное значение c, затем получите второе значение - PullRequest
0 голосов
/ 19 января 2020

Пока мой код

SELECT * FROM gp 
WHERE status IN ('priority', NULL)  
   AND (status='priority' OR EXISTS(SELECT * FROM gp WHERE status IS NULL)) 
LIMIT 1

Я пытаюсь получить первую строку с помощью status = 'priority', если она существует, или же получить первую строку с помощью status = NULL. Могут быть и другие значения для статуса, но сначала я хочу получить priority, если доступно, затем NULL.

Что мой код делает до сих пор, он возвращает строки с status = 'priority', когда они существуют, но ничего не возвращает, когда существуют только NULL.

1 Ответ

2 голосов
/ 19 января 2020

Вы не можете использовать NULL в выражении IN, поэтому вам нужно изменить первую часть предложения WHERE на

WHERE status = 'priority' OR status IS NULL

Вы можете удалить вторую часть WHERE предложение и просто

ORDER BY status = 'priority` DESC

это поместит строки с status = 'priority' впереди тех, которые имеют status из NULL

Таким образом, ваш запрос в целом становится:

SELECT * FROM gp 
WHERE status = 'priority' OR status IS NULL
ORDER BY status = 'priority` DESC
LIMIT 1

Обратите внимание, что для получения «первой» строки с status = 'priority' вам нужен столбец порядка (SQL таблицы не упорядочены, поэтому без столбца порядка «первый» не имеет смысла), и вы можно добавить это к предложению ORDER BY:

SELECT * FROM gp 
WHERE status = 'priority' OR status IS NULL
ORDER BY status = 'priority` DESC, id ASC
LIMIT 1
...