SQL如何提取值非空的booth_前缀列名拼接为|分隔字符串
int类型查询失败原因
你参考的bit类型示例支持直接判断列值是否为真,是因为SQL Server中bit类型会被隐式转换为布尔值处理,int类型不支持该隐式转换,必须显式写明判断条件列名 <> 0 AND 列名 IS NOT NULL,调整判断逻辑后即可正常运行。
实现方案
方案1:显式列出所有booth_前缀列(兼容所有SQL Server版本,无权限要求)
逻辑稳定,不需要系统表查询权限,列数不多时推荐使用:
SELECT STRING_AGG(booth_col, '|') AS result FROM ( VALUES (CASE WHEN booth_100 <> 0 AND booth_100 IS NOT NULL THEN 'booth_100' END), (CASE WHEN booth_101 <> 0 AND booth_101 IS NOT NULL THEN 'booth_101' END), (CASE WHEN booth_102 <> 0 AND booth_102 IS NOT NULL THEN 'booth_102' END), (CASE WHEN booth_103 <> 0 AND booth_103 IS NOT NULL THEN 'booth_103' END), (CASE WHEN booth_105 <> 0 AND booth_105 IS NOT NULL THEN 'booth_105' END), (CASE WHEN booth_121 <> 0 AND booth_121 IS NOT NULL THEN 'booth_121' END), (CASE WHEN booth_200 <> 0 AND booth_200 IS NOT NULL THEN 'booth_200' END), (CASE WHEN booth_201 <> 0 AND booth_201 IS NOT NULL THEN 'booth_201' END) -- 其余booth_前缀列按相同格式补充即可 ) AS t(booth_col) WHERE booth_col IS NOT NULL;
方案2:动态SQL自动获取列(无需手动列全,适合列数极多的场景)
需要查询系统表的权限,SQL Server 2017及以上版本可用:
DECLARE @sql NVARCHAR(MAX); -- 自动拼接所有booth_前缀列的判断逻辑 SELECT @sql = STRING_AGG( 'CASE WHEN ' + QUOTENAME(name) + ' <> 0 AND ' + QUOTENAME(name) + ' IS NOT NULL THEN ''' + name + ''' END', '),(' ) FROM sys.columns WHERE object_id = OBJECT_ID('你的实际表名') -- 替换为你要查询的表名 AND name LIKE 'booth\_%' ESCAPE '\'; -- 拼接完整查询语句 SET @sql = N' SELECT STRING_AGG(booth_col, ''|'') AS result FROM (VALUES (' + @sql + ')) AS t(booth_col) WHERE booth_col IS NOT NULL; '; EXEC sp_executesql @sql;
低版本SQL Server适配
如果使用SQL Server 2016及更早版本,没有内置STRING_AGG函数,可以把拼接逻辑替换为FOR XML PATH写法:
SELECT STUFF( (SELECT '|' + booth_col FROM ( -- 此处填入方案1的VALUES判断逻辑即可 ) AS t(booth_col) WHERE booth_col IS NOT NULL FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ) AS result;
内容的提问来源于stack exchange,提问作者whispers
相关产品推荐
相关产品推荐

