检查NULL或0

时间:2010-10-21 14:00:21

标签: sql sql-server database tsql

SQL检查NULL或0

的值的速度更快

我希望以最快的方式检查表中的值。

例如哪个更快:

IF ((SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers] 
     WHERE VALUE = @myVal) is null )
BEGIN
....
END
ELSE
BEGIN
....
END

IF ((SELECT COUNT(ID) FROM [SomeTable].[dbo].[BlockedSubscriberNumbers]
     WHERE VALUE = @myVal) > 0 )
BEGIN
....
END
ELSE
BEGIN
....
END

在T-SQL中也可以扮演频繁积累案例的角色。我的意思是它会更快,在大多数情况下它会失败到IF块,如果它将主要进入ELSE会更慢。

6 个答案:

答案 0 :(得分:2)

这些实际上会做不同的事情,你无法检查SQL中NULL是否大于0。

你应该做的就是这个。

    IF (ISNULL((SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers] 
         WHERE VALUE = @myVal), 0) > 0 )
    BEGIN
    ....
    END
    ELSE
    BEGIN
    ....
    END

你真的意味着等于0吗?因为你的问题陈述

  

SQL检查值的速度更快   为NULL或0

这部分是关于Joe关于多个结果集的评论

您可以使用ISNULL对Select ID执行某种聚合函数,以确定是否有任何值大于0(当然假设您的所有值都大于0)。

关于根据OP评论确定是否有任何行包含该信息

IF (Select Count(ID) from [SomeTable].[dbo].[BlockedSubscriberNumbers] Where Value = @myVal) = 0 Shoud告诉你是否有任何行包含该值

最终修改

只需使用Exists

即可

If Exists(Select ID From [SomeTable].[dbo].BlockedSubscriberNumbers] Where Values = @myVal)

答案 1 :(得分:1)

检查NULL比检查0快得多,但我认为,对于这些查询,我们讨论的是不同的事情:它们产生不同的结果。

答案 2 :(得分:1)

对于在查询中需要它的任何人,您都可以执行以下操作:

final Consumer<yourKey,yourValue> consumer; //consumer with consumer config final ConsumerRecords<String, String> consumerRecords = consumer.poll(pollvals); consumerRecords.forEach(record -> { System.out.printf("[Consumer Record:(key - %s,value- %s,partition- %d, offset %d)]\n", record.key(), record.value(), record.partition(), record.offset()); //parse your json from either key or from value String value=null; ..... value = jsonparser(record.value()); // lets parse from value. ...

在这里,只有在已经为NULL或为0的情况下,NULLIF才将SELECT ISNULL(NULLIF(primaryValue,0),secondaryValue) as Value FROM SomeTable作为NULL返回。如果primaryValue为NULL,则ISNULL将返回secondaryValue

因此,如果primaryValue为NULL或0,则它将返回primaryValue

答案 3 :(得分:0)

IMO,表中的每个记录/行都包含NULL BITMAP (2个字节,每个位告诉该行中一个/每个列的值的空值),所以在选择之前/读取实际存储值这个读取数据的过程通过这个NULL位图检查/读取相应的位。

如果是NULL(或者换句话说,“非空”检查),则此阶段的阅读过程会停止,而其他选择/检查/比较可能(或者可能不会,这取决于)继续,所以“无效检查”不能慢。更重要的是,行末尾的NULL值甚至没有存储,它们没有占用存储空间。它们实际上几乎没有任何东西。

尽管如此,问题在于你的TSQL示例和问题本身是不明确的,可能有多种解释和答案。

答案 4 :(得分:0)

EXISTS可能比COUNT快,特别是如果您要查找的行非常大,此外您不应过多地关注微优化。首先争取代码可读性,因此读取代码的其他人可以轻松收集查询的意图。无论如何,COUNT仍然会尝试循环行,即使它已经找到了您正在寻找的值。 EXISTS是RDBMS在符合您的标准后立即停止搜索的指令。

此外,如果存在 ,代码的逻辑就是,这就是为什么有一个第一类语言结构被引入语言以促进这一点。当然,数据库供应商的工程师将努力优化它,因为它基本上是一个解决的问题。你不会指望他们重新使用他们的COUNT引擎来获得EXISTS功能,如果EXISTS等待COUNT及其结果,那将是非常糟糕的,然后检查该结果是否大于零以使{{1返回true。这不会发生。

EXISTS非常优化

这在可读性和性能方面都更好:

EXISTS

以下可能会产生很多行。如果表中有很多行满足过滤器,则会导致错误:

IF EXISTS(SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers] 
     WHERE VALUE = @myVal) 

该查询方法的唯一兑换因素是,如果您的表上的VALUE字段是主键(但是假设您忘记将主键放在该表上),并且它返回两行,这不会产生静默错误,RDBMS shall balk with error,与IF ((SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers] WHERE VALUE = @myVal) is null ) COUNT方法相比,您可以更早修复错误

答案 5 :(得分:-1)

var $scope = {},
    dataSource;

$scope.leadsDataSource = [{ id: 1, type: 1, typeName: "Lead", client: 1, clientName: "Ljungbloms Elektriska AB", marking: "Marking for Ljungbloms Elektriska AB", status: 2, statusName: "Open", stage: 2, stageName: "Stage 2", leadValue: 1, probability: 1, issuer: 1, issuerName: "Sales", handler: 1, handlerName: "Sales", created: 1462345200000, createdString: "2016-05-04" }, { id: 2, type: 1, typeName: "Lead", client: 2, clientName: "Solina Sweden AB", marking: "Marking for Solina Sweden AB", status: 1, statusName: "Closed", stage: 3, stageName: "Stage 3", leadValue: 1, probability: 1, issuer: 1, issuerName: "Sales", handler: 1, handlerName: "Sales", created: 1462345200000, createdString: "2016-05-04" }, { id: 3, type: 2, typeName: "Opportunity", client: 3, clientName: "H & M Hennes & Mauritz GBC AB", marking: "Marking for H & M Hennes & Mauritz GBC AB", status: 3, statusName: "Pending", stage: 4, stageName: "Stage 4", leadValue: 1, probability: 1, issuer: 1, issuerName: "Sales", handler: 1, handlerName: "Sales", created: 1462345200000, createdString: "2016-05-04" }];

dataSource = $scope.leadsDataSource.filter(function (a) {
    return a.typeName == 'Lead';
});

console.log(dataSource);