如果我们传递空值,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
,如果@Parameter
是NULL
,则使用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()
检查值是否为空并返回 true 或 false。这不是这个函数的作用。我已经粘贴了 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) 返回啥?的主要内容,如果未能解决你的问题,请参考以下文章