我想知道这段代码背后的原因。如果我们在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
答案 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