我正在尝试创建一个case表达式,该表达式查找表中的所有列,其ColumnName为‘%45-’,ColumnName为'45-‘为非空。
SELECT *,
CASE
WHEN (SELECT [name]
FROM tempdb.sys.columns
WHERE [object_id] = Object_id(N'tempdb..#temp')
AND [name] LIKE '45-%') IS NOT NULL THEN 1
ELSE 0
END AS x
FROM #temp 但是,我得到了一个错误:
子查询返回的值超过一个。当子查询跟随=、!=、<、<=、>、>=或子查询用作表达式时,这是不允许的。
有什么办法让这件事起作用吗?
==============================================================
添加表以供输出参考
name 45-AB 72 36 NewColumn
Dan null null null 0
Steve 1 null null 1发布于 2019-12-12 20:39:46
只要
SELECT [name]
FROM tempdb.sys.columns
WHERE [object_id] = OBJECT_ID(N'tempdb..#temp') and [name] like '45-%'返回多个它无法工作的值。对于子查询,如果将其结果与值(为null或等于)进行比较,则必须返回一个值。
试试这个:
SELECT *,
CASE
WHEN exists(SELECT [name]
FROM tempdb.sys.columns
WHERE [object_id] = Object_id(N'tempdb..#temp')
AND [name] LIKE '45-%') THEN 1
ELSE 0
END AS x
FROM #temp 发布于 2019-12-12 23:49:26
下面的代码将生成(如果取消注释EXEC行) sql代码,它将返回表的字段名,如果列包含至少一个非空值,则返回一个1;如果字段中的所有值为空,则为0。
您可以在下面的代码中添加像'45-%‘这样的where列名,这样它只会计算/返回这些字段。
select 1 as '45-1', 2 as '45-2', null as '45-3', 4 as '45-4' into #temp
DECLARE @tb nvarchar(512) = N'tempdb..#temp';
DECLARE @sql nvarchar(max) = N''
SELECT @sql += 'select ''' + QUOTENAME(name) + ''' as ColumnName, case when (select top 1 ''Not Null'' from tempdb..#temp where ' + QUOTENAME(name) + ' is not null ) = ''Not Null'' Then 1 else 0 end as IsColumnNull
Union '
FROM tempdb.sys.columns
WHERE [object_id] = OBJECT_ID(@tb);
set @sql = left(@sql,len(@sql) - 5)
select @sql
--EXEC sys.sp_executesql @sql;

https://stackoverflow.com/questions/59312329
复制相似问题