Рассмотрим это утверждение выбора:
SELECT *,
1 AS query_id
FROM players
WHERE username='foobar';
Возвращает столбец query_id
со значением 1
вместе с другими столбцами игрока.
Как можно заставить приведенный выше SQL возвращать хотя бы значение query_id
of, 1
даже если select не находит подходящих строк?
Кстати, это PostgreSQL 8.4.
postgresql
select
null
Натанаэль Вайс
источник
источник
order by
. Второй «создает» виртуальную таблицу с ровно одной строкой и одним столбцом и выполняет внешнее соединение (без каких-либо «реальных» условий соединения), таким образом, вы всегда возвращаете хотя бы одну строку. Использованиеselect *
в рабочем коде - плохой стиль. Не делай этого. Всегда перечисляйте нужные вам столбцы.select *
следует использовать только в специальных запросах.left join
не читабельным?UNION ALL
иногда он может быть более эффективным, чемUNION
, поскольку вы явно указываете планировщику запросов, что вы ожидаете, что вUNION
запросах ed не будет повторяющихся строк, или если Вы хотите, чтобы они были выведены. БезALL
модификатора он предполагает, что вы хотите удалить дубликаты строк (только одну возвращаемую), так же, как сDISTINCT
ключевым словом, и гарантировать, что может потребоваться дополнительная проверка или повторное сканирование результатов. Так что используйтеALL
с,UNION
если вам не требуется дедупликация выходных строк.Если вы ожидаете только одну или ноль строк назад, то это также будет работать:
Это вернет одну строку со всеми значениями, имеющими нулевое значение, кроме query_id, если строка не найдена.
источник
username = 'foobar'
Здесь перезвонили немного позже, но вот синтаксис, который работает (по крайней мере в 9.2, не пробовал более ранние версии).
Возвращает «пустую» строку, только если все содержимое «a» равно нулю.
Наслаждаться. / bithead
источник
источник