如果我们传递空值,Sql查询ISNULL(@参数,ColumnName)返回什么。

时间:2015-11-05 12:18:20

标签: mysql sql sql-server mysql-workbench

我想知道这段代码背后的原因。如果我们在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:请在downvoting之前评论原因:P

5 个答案:

答案 0 :(得分:2)

如果您使用的是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;

出于性能原因,您应该使用以下代码,因为您的代码非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 ║
╚════════╩════╝

答案 1 :(得分:0)

也许我误解了你的问题,但你可以在下面进行测试。 @Parameter声明为NULL,如果ISNULL@Parameter,则使用NULL设置其他值,在此示例中为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

答案 2 :(得分:0)

当值为NULL时,ISNULL函数返回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值的行。

答案 3 :(得分:0)

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

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

sample base64 image string

答案 4 :(得分:0)

Throwable:Merged rootsChanged not allowed inside rootsChanged, rootsChanged level == 1 如名称所示,将检查值是否为ISNULL。 如果它是&#39; null&#39;将返回null其他true

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