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会更慢。
答案 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);