使用CASE表达式为变量赋值后查询无返回结果,求助排查
问题排查与解决
嘿,我一眼就揪出你代码里的问题了——这是个典型的SQL执行顺序搞反的坑!
咱们先理清楚SQL语句的执行逻辑:数据库会先处理FROM和JOIN关联表,接着用WHERE子句过滤数据,最后才会执行SELECT里的字段选择和变量赋值。
你原来的代码里,WHERE子句加了@vAdress = CASE ...,但这时候@vAdress还没被SELECT里的语句赋值呢!它初始状态是NULL,而SQL里NULL和任何值比较的结果都是UNKNOWN,相当于这个条件永远不满足,自然查不到任何结果。
修正方案1:直接输出地址(无需变量)
如果你只是想在查询结果里展示对应地址,完全不用变量,把CASE表达式直接放到SELECT里就行:
SELECT H.FIRSTNAME, H.LASTNAME, CASE WHEN H.D_ADRESS IS NOT NULL THEN H.D_ADRESS WHEN H.F_ADRESS IS NOT NULL THEN H.F_ADRESS ELSE H.O_ADRESS END AS Adress, C.COUNTRY FROM History H LEFT JOIN COUNTRY C ON H.COUNTRYCODE = C.COUNTRYCODE WHERE H.EMAILADRESS = 'johndoe.doe@test.com'
修正方案2:需要给变量赋值的情况
要是你必须把地址存到@vAdress变量里,那把变量赋值放到SELECT中,同时删掉WHERE里那个错误的条件:
DECLARE @vAdress AS VARCHAR(50) SELECT H.FIRSTNAME, H.LASTNAME, @vAdress = CASE WHEN H.D_ADRESS IS NOT NULL THEN H.D_ADRESS WHEN H.F_ADRESS IS NOT NULL THEN H.F_ADRESS ELSE H.O_ADRESS END, C.COUNTRY FROM History H LEFT JOIN COUNTRY C ON H.COUNTRYCODE = C.COUNTRYCODE WHERE H.EMAILADRESS = 'johndoe.doe@test.com'
这样执行后,@vAdress会被成功赋值,同时结果集也能正常返回。
记住这个SQL执行顺序的小细节,下次就不会踩同样的坑啦!
内容的提问来源于stack exchange,提问作者WhoAmI
相关产品推荐
相关产品推荐

