多个条件列的SQL查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多个条件列的SQL查询相关的知识,希望对你有一定的参考价值。

对于标题的原谅我似乎无法弄清楚我能做些什么。我有一个MainTable有一些列在另一个表DefTable中定义

简化,因为这些列从Col1运行到Col99

可维护性

RowId Col1 Col2 Col3 Col4
----- ---- ---- ---- ----
  1    Y   N    N    N
  2    N   Y    N    N
  3    N   N    N    Y

DefTable

Key Description
--- -----------
 1  Logistics
 2  Warehouse
 3  Packaging
 4  MainLobby

条件是: 如果列标记为Y我应该根据Description中的键显示DefTable

此外,我正在研究两个或更多列的可能性被勾选Y。如果发生这种情况我应该ConcatenateLogistics, MainLobby的结果

预期产出

RowId Description
----- -----------
  1   Logistics
  2   Warehouse
  3   MainLobby

多个勾选列的可能性

RowId Description
----- -----------
  1   Warehouse, MainLobby

我一直在修补这个answer,但我仍然卡住了。请帮我。

答案

我猜这就是你要找的东西。

您的数据看起来像:

可维护性

 SELECT *  INTO #MainTable FROM (
  VALUES(1,'Y','N','N','N'),
  (2,'N','Y','N','N'),
  (3,'N','N','N','Y')
  ) AS A(RowId ,Col1 ,Col2 ,Col3 ,Col4)

DefTable

 SELECT * INTO #DefTable FROM (
 VALUES(1,'Logistics'),
 (2,'Warehouse'),
 (3,'Packaging'),
 (4,'MainLobby')
 )AS A([Key],[Description]) 

查询:

 SELECT M.RowId ,
 CASE WHEN (Col1='Y' OR Col2='Y' OR Col3='Y' OR Col4='Y' )THEN D.Description ELSE '' END AS [Description] 
 FROM #MainTable M
 INNER JOIN #DefTable D ON D.[Key]=M.RowId

动态方法:

DECLARE @QUERY NVARCHAR(MAX),@COLUMNSQUERY NVARCHAR(MAX)

SET @COLUMNSQUERY=(SELECT 'CASE '+(SELECT  'WHEN '+COLUMN_NAME +'=''Y'' THEN [DESCRIPTION] ' 
    FROM [tempdb].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME like '#MainTable%' 
    and COLUMN_NAME <>'RowId' for xml path('') ) + 'ELSE '''' END AS [DESCRIPTION]' )

SET @QUERY=' SELECT M.RowId ,'+@COLUMNSQUERY + 'FROM #MainTable M
INNER JOIN #DefTable D ON D.[Key]=M.RowId'

EXEC (@QUERY)

注意:我从Temp db中选择了临时表的列。请将其替换为主表所在的实际数据库

用这个FROM [tempdb].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME like '#MainTable%'替换这个条件FROM [YourDatabaseName].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME like 'Your Main table Name%'

另一答案

你会使用Apply运算符(即CROSS APPLY

SELECT a.RowId, d.Description 
FROM MainTable  t
CROSS APPLY (
       VALUES (t.RowId, 1, t.Col1), (t.RowId, 2, t.Col2),
              (t.RowId, 3, t.Col3), (t.RowId, 4, t.Col4)
              ....
)a(RowId, Id, Cols)
INNER JOIN DefTable d ON d.[Key] = a.Id
WHERE a.Cols = 'Y'

以上是关于多个条件列的SQL查询的主要内容,如果未能解决你的问题,请参考以下文章

基于多个条件的 SQL 查询

查询多个结果是用case when 条件显示列的查询效率高,还是查询后union all合并效率高.

SQL 查询多条符合条件的记录

SQL语句的补充

sql一列有多值查询,根据多个只查询我想要的数据

来自有条件和无条件列的 SQL 查询分组的比率或百分比