首页 > 解决方案 > 如何使用“CASE WHEN”语句聚合行并将查询构建为字符串

问题描述

这是我的示例表:

TableName    ColumnName    
Sample       Name 
Sample       MiddleName 
Sample       LastName 

我正在尝试测试以下代码:

SELECT 'SELECT ' +
CASE WHEN TableName IS NOT NULL AND ColumnName IS NOT NULL THEN  TableName_ColumnName 
     WHEN TableName IS NOT NULL AND ColumnName IS NULL THEN TableName_NULL
     ELSE ISNULL(ColumnName, 'NULL') 
END
+ ' FROM [TestDB].[dbo].' + TableName
FROM [TestDB].[dbo].[TestTable] WHERE TableName = 'Sample'

这是我从上面得到的结果,它包括SELECTand'FROM [TestDB].[dbo]' + TableName对于每一行,这不是我想要的:

SELECT  Sample_Name  FROM [TestDB].[dbo].Sample
SELECT Sample_MiddleName  FROM [TestDB].[dbo].Sample
SELECT Sample_LastName   FROM [TestDB].[dbo].Sample

理想的结果应该是这样的:

SELECT 
Sample_Name  
Sample_MiddleName 
Sample_LastName 
FROM [TestDB].[dbo].Sample

我错过了什么?

标签: sql-servertsql

解决方案


如果我从您的问题中正确理解,您需要这样的解决方案:

WITH TableNamesCTE AS
(
    SELECT DISTINCT TableName
    FROM TestTable
)
SELECT 'SELECT ' +
    (SELECT STRING_AGG(CASE WHEN TableName IS NOT NULL AND ColumnName IS NOT NULL THEN  CONCAT(TableName, '_', ColumnName)
                            WHEN TableName IS NOT NULL AND ColumnName IS NULL THEN CONCAT(TableName, '_NULL')
                            ELSE ISNULL(ColumnName, 'NULL')
                            END, ',')
     FROM [TestTable] TT
     WHERE TT.TableName = TN.TableName)
+ ' FROM [TestDB].[dbo].' + TableName
FROM TableNamesCTE TN
WHERE TN.TableName = 'Sample';

我用 CTE 分隔表名,所以如果你有 100 个表,那么这个查询将产生 100 个查询字符串。准备好所有表后,在查询的第二部分中,您将汇总所有这些内容。

SQL Server 命令STRING_AGG从 2017 版本开始可用。欲了解更多信息:https ://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-ver15


推荐阅读