Как выбрать в диапазоне и распечатать, если нет результата по одному из пунктов - PullRequest
0 голосов
/ 03 октября 2019

У меня есть таблица, которая, скажем для простоты, состоит только из идентификаторов и имен:

select * from mytable;
+----+-------+
| id | name  |
+----+-------+
|  1 | Test1 |
|  2 | Test3 |
|  3 | Test3 |
+----+-------+
3 rows in set (0.20 sec)

Я хочу выбрать идентификаторы в подмножестве идентификаторов:

select * from mytable where id in (1 ,3, 88);
+----+-------+
| id | name  |
+----+-------+
|  1 | Test1 |
|  3 | Test3 |
+----+-------+
2 rows in set (0.20 sec)

Как вывидите нет 88 в результате. Я хочу пометить его и напечатать что-то вроде «НЕТ».

Я надеюсь получить что-то вроде этого:

select * from mytable where id in (1 ,3, 88, 99);
+----+-------+
| id | name  |
+----+-------+
|  1 | Test1 |
|  3 | Test3 |
| 88 | NO    |
| 99 | NO    |
+----+-------+
4 rows in set (0.20 sec)

Заранее большое спасибо!

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Вы можете попробовать ниже -

select num,coalesce(name,'No') as Name
from
(select 1 as num union all select 3 union all select 88 union all select 99 
)A left join mytable b on a.num=b.id
0 голосов
/ 03 октября 2019

Лучшее долгосрочное решение здесь может заключаться в том, чтобы просто поддерживать в календарной таблице все возможные значения id, которые вы ожидаете использовать для поиска. Вместо этого мы можем использовать встроенный подзапрос:

SELECT
    t1.id,
    COALESCE(t2.name, 'NO') AS name
FROM
(
    SELECT 1 AS id UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    -- other numbers
    SELECT 88 UNION ALL
    -- more numbers
    SELECT 99
) t1
LEFT JOIN mytable t2
    ON t1.id = t2.id
WHERE
    t1.id IN (1, 3, 88, 99)
ORDER BY
    t1.id;

Стратегия здесь двоякая. Сначала мы оставляем присоединение таблицы календаря к вашей таблице, сохраняя все значения id во всем диапазоне. Затем мы ограничиваемся только id значениями, которые вы хотите увидеть. Для тех id значений, которые не появляются в вашей таблице, имена будут отображаться как NULL.

...