sql-server - 如何使用“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'
这是我从上面得到的结果,它包括SELECT
and'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
我错过了什么?
解决方案
如果我从您的问题中正确理解,您需要这样的解决方案:
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
推荐阅读
- github - 如何从 GitHub 加载预训练模型?
- javascript - react js中的常见标题问题
- linux - 如何根据文件在 linux 中的名称将文件移动到新目录?
- qt - 在qt中,如何让treemodel返回两个值给treeview,一个显示,另一个隐藏?
- java - 我应该遵循哪些步骤来确定一杯液体的液位?
- c# - netcore5 视图组件自定义视图搜索路径不适用于区域
- python - 为什么 cv2.getRectSubPix 中心会出现这种意外行为?
- javascript - Googel Apps 脚本 hasNext() 返回 false
- node.js - Firebase ID 令牌即使在 jwt 上也具有无效签名
- google-chrome - 进度条标记动画在 Chrome 中不起作用