Предположим, у меня есть таблицы a (со столбцом a1) и b (со столбцами b1 и b2), и я выполняю внешнее левое соединение
SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1
Тогда b1 и b2 будут равны NULL, если значение a1 не соответствует значению b1.
Могу ли я указать значение по умолчанию для b2 вместо NULL? Обратите внимание , что COALESCE не будет работать здесь, потому что я не хочу , значение по умолчанию для переопределения потенциальных NULLs в b2 , где это значение b1 согласования a1.
То есть с а и б как
CREATE TABLE a (a1)
AS VALUES (1),
(2),
(3) ;
CREATE TABLE b (b1,b2)
AS VALUES (1, 10),
(3, null) ;
a1 b1 | b2
--- --------
1 1 | 10
2 3 | NULL
3
и по умолчанию для b2, скажем, 100, я хочу получить результат
a1 | b1 | b2
---------------
1 | 1 | 10
2 | NULL | 100
3 | 3 | NULL
В этом простом случае я мог бы сделать это «вручную», посмотрев, является ли b1 нулевым в выводе. Это лучший вариант в целом, или есть более стандартный и аккуратный способ?
postgresql
join
Том Эллис
источник
источник
sql
(что означает «SQL язык запросов». Этот тег не обозначает какой-либо конкретный продукт или диалект СУБД). Часть:[b2]=CASE WHEN ... END
является недопустимым (стандартным) выражением SQL.Первоначальный ответ на этот вопрос остался необъяснимым, поэтому давайте попробуем еще раз.
Используя
CASE
утверждениеИспользуя этот метод, мы используем другое значение в другом столбце, которое
IS NOT NULL
в этом случае,b.b1
если это значение равно нулю, мы знаем, что соединение не удалось.Это будет полностью работать и генерировать именно то, что вы хотите.
Использование sub-SELECT
Не используйте этот метод, это идея наращивания. Продолжай читать.
Если у нас нет каких-либо
NOT NULL
столбцов, которые мы могли бы использовать таким образом, нам нужно что-то, чтобы создать столбец, который мог бы работать таким образом для нас ...Использование сравнения строк
Еще проще, чем форсировать ложное значение, для которого мы можем сравнить, - сравнить строку. В PostgreSQL строка имеет значение по имени таблицы. Например,
SELECT foo FROM foo
возвращает строку типаfoo
(которая является типом строки) из таблицыfoo
. Здесь мы проверяем, является ли эта строка нулевой. Это будет работать до тех пор, пока каждый столбецIS NOT NULL
. И, если каждый столбецIS NULL
в вашей таблице, то вы просто троллинг.источник
b1
используемый вCASE
растворе, не должен быть необнуляемым. Строительство работает в любом случае.Я считаю, что в этом случае COALESCE будет очень полезен. Он вернет первое ненулевое значение из списка:
источник