繁体   English   中英

t-sql:内置布尔函数之间不兼容

[英]t-sql: incompatibility between built-in boolean functions

为什么内置的布尔函数在NULL输入上的行为会有所不同? 例如-此查询:

select 'ISDATE(null)'                 as function_call, 
        ISDATE(null) as result union all
select 'ISNUMERIC(null)'              as function_call, 
        ISNUMERIC(null) as result union all
select 'IS_MEMBER(null)'              as function_call, 
        IS_MEMBER(null) as result union all
select 'IS_SRVROLEMEMBER(null, null)' as function_call, 
        IS_SRVROLEMEMBER(null, null) as result

给我们:

function_call                result
---------------------------- -----------
ISDATE(null)                 0
ISNUMERIC(null)              0
IS_MEMBER(null)              NULL
IS_SRVROLEMEMBER(null, null) NULL

看起来ISDATEISNUMERIC行为符合布尔逻辑,但IS_MEMBERIS_SRVROLEMEMBER行为符合三值逻辑 所有布尔函数在NULL输入上的行为不应该都一样吗? ANSI SQL标准对此有何评论?

谢谢

对于ANSI标准,后两个功能与ANSI SQL无关; 它们是MSSQL特定的安全功能。 这并不是说它们不是其他DBMS中的类似物,只是说明它们不是“典型的” UML样式函数或标准的一部分。

我其实在搜索这个合理的权威O'Reilly的网页有关的术语“布尔” ANSI标准功能不返回任何结果。 由此可以推断出,对于这种标量函数对NULL的处理没有ANSI方法。

这些函数中需要使用三值逻辑,以允许NULL表示输入无效 例如,请参阅MSDN IS_MEMBER() 备注”部分。

(不要将这种形式的NULL返回与可能返回一个值的聚合函数相混淆,如果聚合函数的输入之一为NULL,则为NULL。)

如果您真正需要的是,没有什么能阻止您“包装”这些功能使其像其他功能那样运行。 例如ISNULL(IS_MEMBER(someValueFromATable),0)

如您所见,前两个函数返回一个有意义的布尔值。

例如, ISDATE(null)返回false,因为null 不是有效的日期,时间或datetime ”( MSDN ,我强调value )。

在将NULL解释为“未知”的情况下,当输入未知但在编程上不可行时, ISDATE()等返回“未知”在语义上有意义。 当我们已经有一个针对ISNULL()类型非特定测试时,将(从所有这些布尔函数中)结果(从所有这些布尔函数)“转换”为布尔逻辑的需求是完全多余的。

在比较您确定的两种类型的函数时,在这种情况下,后一种函数的返回值不应为NULL,因为虽然NULL不是日期,但它肯定是可以正确检查的有效数据通过此功能。

这些安全功能( IS_SRVROLEMEMBER )的行为与系统/数据类型函数( ISNUMERIC )有所不同,这并不奇怪,因为这些安全功能本质上是查询,并且结果可以根据查询的对象而改变。 对于所有这些, MSDN文档中都很好地阐明了返回值(包括空值)的含义。

更具体地说,对于ISNUMERICISDATE的参数,您可以提前很好地测试参数是否为null,因此我不确定是否需要返回null或是否具有实用性。

对于安全性函数的参数,您可能具有非null参数,但是以一种有用的方式构建了这些函数,以在参数无效,未找到或您没有权限的情况下返回null知道答案。

当然,其中很多都可以看作是主观的,因此无论是否有趣,我都投票赞成结束这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM