已编辑和未删除
回答 A.:是的,或者在这种情况下,您可以使用与 COALESCE() 相同的结果的 ISNULL()。
对 B 的回答:不要将 varchar 转换为 varbinary 来比较它们,但要了解使用聚合时的排序规则排序顺序。
我认为这个代码片段回答了 NULL 问题的计数,但我仍然对这个问题有点困惑:
select count(*) from sys.indexes;
-- 697 results
go
select count(isnull(name,'')) from sys.indexes;
-- 697 results
go
select count(name) from sys.indexes;
-- 567 results
go
这将获取 MINname
字段的记录数(基于字符串字段的排序规则和 SQL 排序顺序):
select i.name
,subCnt.Cnt
from (select min(name) as name from sys.indexes) as i
join (select name, count(*) as Cnt from sys.indexes group by name) as subCnt
on subCnt.name = i.name;
此查询解释了聚合排序顺序以及上述查询为什么选择name
字段中返回的值:
select name, row_number() over (order by name) from sys.indexes order by name;
即使用 char(0x7E) 替换 NULL,此查询也会显示我的排序规则 (Latin1_General_BIN) 的排序顺序:
select coalesce(name,char(0x7e))
, row_number() over (order by coalesce(name,char(0x7e)))
from sys.indexes order by 2;
这显示了 SQL Server 中排序规则之间的排序顺序差异(确定字符串字段中的 MIN 或 MAX):
declare @test table (oneChar char(1) collate Latin1_General_BIN
, oneChar2 char(1) collate SQL_Latin1_General_CP1_CI_AS
, varb varbinary)
insert into @test (oneChar)
select 'c' union all
select '~' union all
select 'P' union all
select 'X' union all
select 'q' union all
select NULL
update @test set varb = cast(isnull(oneChar,char(0x7E)) as varbinary), oneChar2 = oneChar
select min(oneChar) from @test -- 'P'
select min(oneChar2) from @test -- '~'
select min(varb) from @test -- 0x50, the varbinary equivalent of oneChar
如果您想要所有行的计数并且想要名称的 MIN() 而不考虑 NULL(并且无论出于何种原因都没有看到警告),请使用以下命令:
select i1.Cnt
,i2.name
from (select count(*) as Cnt from sys.indexes) as i1
,(select min(name) as name from sys.indexes where name is not null) as i2
不管你做什么,当然不要为了做一些过滤而将整个字段作为不同的排序规则。这个问题属于讨论论坛,而不是简单的问题/答案。