如果一个或多个列包含非空值,则返回Y/N的最有效方法是什么?

iok*_*ins 5 sql-server null

如果一行中n列中的一列包含非空值,则返回CHAR(1)指示符Y/N的最简洁方法是什么?

在这种情况下,性能很重要,但不是主要考虑因素.

直截了当的方式似乎是:

SELECT      CASE WHEN (C.TerminatedDate IS NULL
                       AND C.SelfClosedDate IS NULL
                       AND ...)
                 THEN 'Y'
                 ELSE 'N' END AS 'OpenInd'

  FROM      Customers C
Run Code Online (Sandbox Code Playgroud)

好奇如果有更好的方法; 了解COALESCE():

SELECT      CASE WHEN COALESCE (C.TerminatedDate, C.SelfClosedDate, ...) IS NULL
                 THEN 'Y'
                 ELSE 'N' END AS 'OpenInd'

  FROM      Customers C
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

数据库服务器是SQL Server 2008.

Ric*_*iwi 4

由于没有人建议,并且问题要求concise..

对于相同的数据类型,直接 COALESCE 是最好的

coalesce(a,b,c,d) is not null
Run Code Online (Sandbox Code Playgroud)

如果您要处理不同的数据类型,请尝试修改后的 COALESCE

coalesce(LEFT(a,1),LEFT(b,1),LEFT(c,1)) is not null
Run Code Online (Sandbox Code Playgroud)

样本:

create table abc (a int, b datetime, c varchar(max), d image)
insert into abc select 1, GETDATE(), '', null
insert into abc select 1, null, '', null
insert into abc select 1, null, '', 0x123123
insert into abc select null, null, '', 0x123123
insert into abc select null, GETDATE(), '', 0x123123
insert into abc select null, null, null, null
insert into abc select 88, GETDATE()+3, null, null
insert into abc select 88, GETDATE()+3, 'gdasdf', null
insert into abc select null, null, '222', 0x123123
insert into abc select null, null, 'abcdef', 0x123123

select *, case when coalesce(LEFT(a,1),LEFT(b,1),LEFT(c,1)) is not null then 'N' else 'Y' end
from abc
Run Code Online (Sandbox Code Playgroud)

如果您不使用 VARCHAR(MAX) 或 IMAGE 等外来类型,则可以将 SQL_VARIANT 与 COALESCE 一起使用

create table abc (a int, b datetime, c varchar(10), d image)
insert into abc select 1, GETDATE(), '', null
insert into abc select 1, null, '', null
insert into abc select 1, null, '', 0x123123
insert into abc select null, null, '', 0x123123
insert into abc select null, GETDATE(), '', 0x123123
insert into abc select null, null, null, null
insert into abc select 88, GETDATE()+3, null, null
insert into abc select 88, GETDATE()+3, 'gdasdf', null
insert into abc select null, null, '222', 0x123123
insert into abc select null, null, 'abcdef', 0x123123

select *, case when coalesce(convert(sql_variant,a),b,c) is not null then 'N' else 'Y' end
from abc
Run Code Online (Sandbox Code Playgroud)