根据特定条件选择连接表的不同列

问题描述 投票:0回答:2

我希望在连接多个表后根据特定条件检索单行的两列。用例子来解释一下,我是这样的:

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

我会使用带有COUNT函数的IF子句来首先单独查看列是否为空,然后使用普通的SELECT语句进行检索。但是,从同一个表中读取3次(检查每列的计数大于等于0;同时两者都是真的,从这些列中进行选择)将是三重努力。我相信它可以更好地增强。

我还在考虑使用两个独立的公用表表达式来与CASE一起使用。但最终出现了语法错误。

任何指导将不胜感激。谢谢!

sql sql-server tsql select sql-server-2014
2个回答
2
投票

您可以使用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

对于上面的答案,如果输出中的任何列可能为null,则需要将输出中的每个列包装在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
投票

我认为这给你想要的东西:

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

检查两次的条件相同。

© www.soinside.com 2019 - 2024. All rights reserved.