Присоединяйтесь к заявлению IF о PostgreSQL - PullRequest
1 голос
/ 05 марта 2020

Допустим, у нас есть таблица и мы хотим выполнить внутреннее объединение

SELECT a.x, a.z, b.y FROM tablea a
INNER JOIN tableb b on a.x = b.y

В некоторых случаях az имеет специальное значение, поэтому объединение не должно выполняться. С оператором IF, но как?

 SELECT a.x, a.z, b.y FROM tablea a
IF (a.z. <> 'special value') THEN INNER JOIN tableb b on a.x = b.y
ELSE LEFT JOIN tableb b on a.x = b.y

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

В предложении ON отметьте a.z = 'special value', например:

SELECT a.x, a.z, b.y 
FROM tablea a INNER JOIN b
ON a.z = 'special value' OR a.x = b.y

или с условным соединением:

SELECT a.x, a.z, b.y 
FROM tablea a LEFT JOIN b
ON 1 = CASE 
  WHEN a.z = 'special value' THEN 0 
  WHEN a.x = b.y THEN 1
END
WHERE a.z = 'special value' OR a.x = b.y
2 голосов
/ 05 марта 2020

Добавьте дополнительное условие:

SELECT a.x, a.z, b.y 
FROM tablea a
  INNER JOIN tableb b on a.x = b.y  AND a.z <> 'special value'

Обратите внимание, что это также полностью удалит эти строки из результата. Если вы все еще хотите получить эти строки из таблицы, вам понадобится внешнее соединение:

SELECT a.x, a.z, b.y 
FROM tablea a
  LEFT JOIN tableb b on a.x = b.y  AND a.z <> 'special value'

, которое вернет все строк из таблицы и только совпадающие строки из таблицы для строк в таблице, где z не имеет этого специального значения

Или, может быть, вы ищете UNION?

SELECT a.x, a.z, b.y 
FROM tablea a
  JOIN tableb b on a.x = b.y  
WHERE a.z <> 'special value'

UNION ALL 

SELECT a.x, a.z, null
FROM tablea a
WHERE a.z = 'special value'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...