在 xml 上选择大小写的默认值

cod*_*ori -1 xml sql-server transaction xquery

select case 'NULL' when 'NULL' then 'f' end as out
Run Code Online (Sandbox Code Playgroud)

输出:f

select case (select  (SELECT LEFT(l.list,LEN(l.list)-1) 
    FROM
    (SELECT  o.Reciting_Path + '|' + o.Declaimer +',' AS [text()]
    FROM    Poetry_Reciting  AS o
    where   o.Poetry_Id=6764
    FOR XML PATH(''))l(list)) )  when  'NULL' then 'N' end as dd
Run Code Online (Sandbox Code Playgroud)

应该只返回NULL并且 NULL 是正确的,但 case 语句不起作用。

我想要输出中的“N”

Aar*_*and 8

这里有两个混淆点。

第一个是你似乎认为'NULL'NULL是一样的;他们不是。前者是字符串文字,后者仅表示没有值。

第二个是你可以NULL在等式比较中使用;而你不能。尝试这个:

SELECT CASE NULL WHEN NULL THEN 1 ELSE 0 END;
Run Code Online (Sandbox Code Playgroud)

结果:

----
0
Run Code Online (Sandbox Code Playgroud)

原因是NULL未知 - 所以 SQL Server 无法告诉您它是否等于或不等于特定值(甚至另一个NULL值)。要检查值是否为NULL,您不能说CASE WHEN value = NULLCASE value WHEN NULL,但可以说CASE WHEN value IS NULL

SELECT CASE WHEN NULL IS NULL THEN 1 ELSE 0 END;
Run Code Online (Sandbox Code Playgroud)

结果:

----
1
Run Code Online (Sandbox Code Playgroud)

现在,我认为有更好的方法来完成你似乎需要的东西(我不相信我完全理解这里的要求),但在短期内你可以通过说:

select case WHEN (select ... )  IS NULL then 'N' end as dd;
Run Code Online (Sandbox Code Playgroud)