Mysql 如果我们传递空值,Sql查询ISNULL(@parameter,ColumnName)返回什么。?
我想知道这个代码背后的原因。如果我们在isNull中传递columnName,将会发生什么Mysql 如果我们传递空值,Sql查询ISNULL(@parameter,ColumnName)返回什么。?,mysql,sql,sql-server,mysql-workbench,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 在这种情况下,它不
@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
也许我误解了你的问题,但你可以在下面进行测试
@参数
声明为NULL
,如果@参数
为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
如果您使用的是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;
出于性能原因,您应该使用下面的代码,因为您的代码是不可销售的
select txtAbc,*
from table
where txtAbc Like @parameter
OR @parameter IS NULL
编辑:
演示:
输出:
╔════════╦════╗
║ txtAbc ║ id ║
╠════════╬════╣
║ aaa ║ 1 ║
║ bbb ║ 2 ║
║ ccc ║ 3 ║
╚════════╩════╝
ISNULL函数在值为NULL时返回1,在值不为NULL时返回0 因此,在您的情况下,如果value@参数为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值的行不会按照您的期望返回。表达式是NULL值,ISNULL函数将返回1
表达式不是空值,ISNULL函数将返回0
mysql> SELECT ISNULL('');
Result: 0
mysql> SELECT ISNULL(NULL);
Result: 1
ISNULL
顾名思义,将检查值是否为null
。
如果其“null”将返回true
elsefalse
示例:虽然ISNULL是SQL Server和MySQL的一部分,但标记您正在使用的产品是一个很好的做法:)@rahultripati什么是好的做法,然后是rahul。?在我之前的评论中已经添加了这一点。如果您使用的是MySQL,那么只标记MySQL,而不标记其他产品。它将帮助你以及其他回答的人(顺便说一句,我不是那个因为你感到麻烦而投反对票的人)不,我一点也不觉得麻烦,我认为它的基本sql和问题可以由任何使用sql产品的人来回答。我想这就是stackoverflow限制5个标记而不是1个标记的原因。附言:不,伙计们,谁在否决这个问题,请告诉我原因。那是不对的
用指定的替换值替换NULL。
@EvaldasBuinauskas:-为什么?@RahulTripathi OP说ISNULL()
检查值是否为NULL并返回true或false。这不是这个函数的作用。我粘贴了MSDN中的描述。@EvaldasBuinauskas:-啊,我采取了另一种方式,我以为你说MSDN引用不正确。(我误解了):(它会忽略输出中包含空值的那一行吗?@Abhii:-在我的情况下,它会忽略,我只是想知道原因。@Abhii:-返回空值的更好方法是检查空值,如txtAbc IS null
,这也是我的想法,请运行此查询。它不会返回那一行,只是与预期相反。@R阿胡尔Tripathi@Abhii:-好的,我明白你的意思了,事实上,你正在尝试比较NULL与NULL类似,后者是False
。你可以使用if(NULL=NULL)print('True')或者print('False')来验证它
我很确定,您已经发布了相同的答案,这也是我所期望的。请在您的计算机中运行代码,如果@parameter=NULL
,它相当于select*from table where txtAbc not NULL
@Abhii Yes假设txtAbc
不是NULL列。当然,您是对的,因为NULLLIKE NULL
为NULL且不为true。
mysql> SELECT ISNULL('');
Result: 0
mysql> SELECT ISNULL(NULL);
Result: 1