Sql 存在比较ColumnName查找的大小写表达式,ColumnName不为null

Sql 存在比较ColumnName查找的大小写表达式,ColumnName不为null,sql,sql-server,Sql,Sql Server,我正在尝试创建一个case表达式,用于查找表中列名为“%45-%”且列名为“45-%”的所有列,其中列名不为null SELECT *, CASE WHEN (SELECT [name] FROM tempdb.sys.columns WHERE [object_id] = Object_id(N'tempdb..#temp') AND [nam

我正在尝试创建一个case表达式,用于查找表中列名为“%45-%”且列名为“45-%”的所有列,其中列名不为null

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
只要

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 

以下代码将生成(并在取消注释EXEC行时执行)sql代码,该代码将返回表的字段名,如果列至少包含1个非空值,则返回1;如果字段中的所有值都为空,则返回0

您可以将where columnname(如“45-%”)添加到下面的代码中,这样它将只计算/返回这些字段

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; 

您正在使用哪些dbms?请改为加入。您将如何加入?我正在使用SQL Server.Ok。有没有“循环”的方法?此外,对每个值进行比较,其中的值如“45-%”问题是我正在使用动态sql创建列。因此,我不知道有多少列标题具有条件值。在RDBMS中,任何形式的循环(几乎)都是一个坏主意,@dcrowley01。RDBMS在集合中工作,程序以迭代方式工作。更新:该解决方案将始终返回1,因为列始终存在,但我需要知道它们何时存在,如果它们有值或为null。如果结果为null,则不会将其视为“存在”,因此else pat将被激活。对于列x中的所有行,上面的表达式将返回1,我认为,因为45%列将始终存在。当45%在行中为空时,x应该等于0。嗨,胡安,这看起来非常接近,或者我没有编辑它来完成我的任务。我对动态sql没有太多经验。虽然从中返回的是一列标题列,然后是一列是否为空。我正在尝试水平返回带有列名的表,并添加一列,查看该值是否为null。这有意义吗?为了清晰起见,增加了上表