Выбор разных столбцов объединяемых таблиц на основе определенных критериев - PullRequest
0 голосов
/ 12 марта 2019

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

SELECT c.column1, c.column2, d.column3, d.column4 
FROM table1 a 
JOIN table2 b ON a.id=b.id 
JOIN table3 c ON b.tabid = c.tabid
LEFT JOIN table4 d ON c.pmid=d.pmid 
WHERE a.id = @id

В случае, когда column1 и column2 не равны NULL, я хочу, чтобы два из них были получены как

SELECT c.column1, c.column2 
FROM table1 a 
JOIN table2 b ON a.id=b.id 
JOIN table3 c ON b.tabid = c.tabid
LEFT JOIN table4 d ON c.pmid=d.pmid 
WHERE a.id = @id

В противном случае, яхотел бы иметь

SELECT d.column3, d.column4
FROM table1 a 
JOIN table2 b ON a.id=b.id 
JOIN table3 c ON b.tabid = c.tabid
LEFT JOIN table4 d ON c.pmid=d.pmid 
WHERE a.id = @id

Я бы использовал предложение IF с функцией COUNT, чтобы сначала увидеть отдельно, являются ли столбцы нулевыми или нет, затем использовал бы простой оператор SELECT для извлечения.Но это будет тройным усилием чтения из одной и той же таблицы 3 раза (чтобы проверить счетчики каждого столбца> 0 или нет; в случае, если оба истинны, выбрать из этих столбцов).Я считаю, что это может быть улучшено лучше.

Я также рассматривал возможность использования двух отдельных общих табличных выражений для использования с CASE.Но закончилось синтаксической ошибкой.

Любое руководство будет оценено.Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Вы можете использовать оператор case, чтобы определить, какие столбцы выводятся из запроса. Если оба имеют значение null, выведите столбцы 3 и 4, а если нет, то выведите столбцы 1 и 2. Возможно, вам придется изменить выводимые значения.

SELECT 
case when isnull(c.column1,'') = '' and isnull(c.column2,'') = '' 
then c.column1 + c.column2 else c.column3 + c.column4 end as 'Column'
FROM table1 a 
JOIN table2 b ON a.id=b.id 
JOIN table3 c ON b.tabid = c.tabid
LEFT JOIN table4 d ON c.pmid=d.pmid 
WHERE a.id = @id

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

Если вы хотите два отдельных вывода столбцов, используйте два оператора case:

SELECT 
case when isnull(c.column1,'') = '' and isnull(c.column2,'') = '' 
then c.column1  else c.column3  end as 'Column1',
case when isnull(c.column1,'') = '' and isnull(c.column2,'') = '' 
then c.column2 else c.column4 end as 'Column2'
FROM table1 a 
JOIN table2 b ON a.id=b.id 
JOIN table3 c ON b.tabid = c.tabid
LEFT JOIN table4 d ON c.pmid=d.pmid 
WHERE a.id = @id

Возможно, вам придется скорректировать оператор case, и я думаю, что есть более эффективные способы в SQL 2014 (я сейчас застрял в режиме SQL 2018 R2).

1 голос
/ 12 марта 2019

Я думаю, это дает то, что вы хотите:

select 
  case when c.column1 is null or c.column2 is null then d.column3 else c.column1 end,
  case when c.column1 is null or c.column2 is null then d.column4 else c.column2 end
FROM table1 a 
JOIN table2 b ON a.id=b.id 
JOIN table3 c ON b.tabid = c.tabid
LEFT JOIN table4 d ON c.pmid=d.pmid 
WHERE a.id = @id

Это одно и то же условие, проверенное дважды.

...