如果我们传递空值,Sql 查询 ISNULL(@parameter,ColumnName) 返回啥?

Posted

技术标签:

【中文标题】如果我们传递空值,Sql 查询 ISNULL(@parameter,ColumnName) 返回啥?【英文标题】:What does the Sql query ISNULL(@parameter,ColumnName) return, if we pass the null value.?如果我们传递空值,Sql 查询 ISNULL(@parameter,ColumnName) 返回什么? 【发布时间】:2016-02-06 06:36:53 【问题描述】:

我想知道这段代码背后的原因。如果我们在 isNull 中传递 columnName 会发生什么。

@parameter = null,

select txtAbc,* from table where (txtAbc Like (isNull(@parameter,txtAbc)))

提前致谢。

编辑此问题以避免混淆。

我知道 isNull 会返回 true,在这种情况下查询看起来像,

select txtAbc,* from table where txtAbc Like null

在这种情况下,它不应该选择任何行,但在我的情况下,它会返回除 txtAbc 中包含空值的行之外的所有行。

我想知道这背后的原因。

运行代码时,我得到的输出相当于 相当于

select * from table where txtAbc is not null

编辑: PS:请在投票前评论原因:P

【问题讨论】:

虽然 ISNULL 是 SQL Server 和 mysql 的一部分,但标记您正在使用的产品是一个好习惯:) @RahulTripathi 那么 rahul 的好做法是什么? 已经在我之前的评论中添加了。如果您使用的是 MySQL,则只标记 MySQL 而不是其他产品。它会帮助你以及其他正在回答的人(顺便说一句,如果你被打扰,我不是投反对票的人 不,我一点也不在乎,我认为它的基本sql和问题可以被任何使用sql产品的人回答。我想这就是为什么 *** 给出了 5 个标签而不是 1 个标签的限制。 PS:没有冒犯 对这个问题投反对票的人,请告诉我原因。? 【参考方案1】:

如果您使用的是 MySQL,则需要 ANSI 等效于 COALESCE

select txtAbc,* 
from table 
where (txtAbc Like (isNull(@parameter,txtAbc)))

如果@parameter = NULL 你得到:

select txtAbc,* 
from table 
where txtAbc Like txtAbc  

这总是正确的(对于txtAbc NOT NULL)。否则同:

select txtAbc,* 
from table 
where txtAbc IS NOT NULL;

出于性能原因,您应该使用下面的代码,因为您的代码是non-SARGable

select txtAbc,* 
from table 
where txtAbc Like @parameter
   OR @parameter IS NULL

编辑:

演示:

CREATE TABLE #tab(id INT IDENTITY(1,1), txtAbc VARCHAR(100));

INSERT INTO #tab VALUES ('aaa'), ('bbb'), ('ccc'), (NULL);

DECLARE @parameter VARCHAR(100) = NULL;

select txtAbc,id 
from  #tab
where (txtAbc Like (isNull(@parameter,txtAbc)))

LiveDemo

输出:

╔════════╦════╗
║ txtAbc ║ id ║
╠════════╬════╣
║ aaa    ║  1 ║
║ bbb    ║  2 ║
║ ccc    ║  3 ║
╚════════╩════╝

【讨论】:

我很确定,您发布了相同的答案,这也是我的预期。请在你的机器上运行代码,If @parameter = NULL,相当于select * from table where txtAbc is not null @Abhii Yes 假设 txtAbc 不是 NULL 列。当然你是对的,因为NULL LIKE NULL 是 NULL 而不是真的。【参考方案2】:

也许我误解了你的问题,但你可以在下面进行测试。 @Parameter 声明为NULL,如果@ParameterNULL,则使用ISNULL 设置另一个值,在本例中为foo。所以它选择col等于foo的数据

create table #t
(
   Id INT,
   col varchar(60)
)
insert into #t values (1, 'foo'), (2, 'bar')

declare @parameter varchar(60) = null

select *
from #t
where col = isNull(@parameter,'foo')

输出

Id  col
1   foo

【讨论】:

【参考方案3】:

表达式为NULL值,ISNULL函数将返回1

表达式不是NULL值,ISNULL函数会返回0

mysql> SELECT ISNULL('');
Result: 0

mysql> SELECT ISNULL(NULL);
Result: 1

【讨论】:

【参考方案4】:

ISNULL 顾名思义,将检查值是否为null。 如果它的'null'将返回true否则false

示例:https://msdn.microsoft.com/en-IN/library/ms184325.aspx

【讨论】:

这不对。 Replaces NULL with the specified replacement value. @EvaldasBuinauskas:- 为什么? @RahulTripathi OP 说ISNULL() 检查值是否为空并返回 truefalse。这不是这个函数的作用。我已经粘贴了 MSDN 的描述。 @EvaldasBuinauskas:- 啊,我反过来说,我以为你说 MSDN 引用不正确。(我误解了):(【参考方案5】:

ISNULL 函数在值为 NULL 时返回 1,在值不为 NULL 时返回 0。

因此,在您的情况下,如果 @parameter 的值为 null,那么它将返回 1 并生成 txtAbc。所以它类似于写成:

select txtAbc,* from table where txtAbc Like txtAbc 

编辑:

它不返回 NULL 行的原因是因为当您将 NULL 与 NULL 进行比较时,结果为 false。所以它就像

if(NULL = NULL)
   print('True')
else
   print('False')

输出将是False。因此,没有按照您的预期返回值为 NULL 的行。

【讨论】:

它会忽略输出中包含空值的行吗?就我而言,它忽略了,我只想知道为什么。? @Abhii:- 返回 NULL 值的更好方法是检查 NULL 值,例如 txtAbc IS NULL 我也是这么想的,请运行这个查询。它没有返回该行,只是与预期相反。 @Rahul Tripathi @Abhii:- 好的,我明白了你的困惑,实际上你正在尝试比较NULL like NULL,即False。您可以使用if(NULL = NULL) print('True') else print('False') 进行验证

以上是关于如果我们传递空值,Sql 查询 ISNULL(@parameter,ColumnName) 返回啥?的主要内容,如果未能解决你的问题,请参考以下文章

sql如何把查询到的NULL替换成空值''

sql如何空值替换成null?

SQL查询不等于空白值如何写

isnull函数

sql server where 字段 is null 的问题

sql server 如何改变计算结果的值 如null改变为0