当查询返回NULL时,SQL COALESCE和IS NULL不返回空格

时间:2018-10-19 16:32:04

标签: sql sql-server-2008 coalesce isnullorempty

我正在尝试优化一个庞大的SQL查询,该查询由自学成才的开发人员编写,该查询使用大量函数而不是JOINS。无论如何,当所选字段中没有值时,我在显示空格或空字符串('')时遇到麻烦。我只包括有问题的SELECT。我遇到最奇怪的问题,或者只是在排除故障时忽略了正确答案。每当我使用COALESCE时,当该字段应为空白字符串时,它就会显示零。当我使用IS NULL时,我会返回NULL。在线上的所有信息似乎都指向使用代码中所示的COALESCE(value,'')。但是我得到的是0而不是“”。有人看到我在做什么错吗?我正在使用SSMS。

SELECT      
pss8.dbo.xml_StripIllegalChars(dbo.rpt_get_series_volume(b.bookkey)) AS p_seriesvol --SELECT to be replaced that works but is slow due to function use I am told
,COALESCE(bd.seriesvolume, '') AS p_seriesvol  --my SELECT that won't work!
FROM 
    bookdetail bd
WHERE 
    --bd.bookkey='303177'
    bd.bookkey='6002'

底部的书键用于测试,因为我知道上面的书键在工作时以前返回了1,而底部的书返回了''。我评论的SELECT上方的SELECT是有效的代码,但运行缓慢。根据我在网上阅读的内容,我说的是“如果没有序列号,则它等于空字符串。” COALESCE不能这样工作吗?如果该字段没有值,或者在这种情况下没有卷号,是否只能返回0?所有帮助,不胜感激。我很好奇听到解决方案!

这里有更多的信息。这是SELECT的工作方式: pss8.dbo.xml_StripIllegalChars(dbo.rpt_get_series_volume(b.bookkey)) AS p_seriesvol

The

.rpt_get_series_vol

函数使用此代码设法创建一个空字符串...这能揭示任何内容吗?

    DECLARE @RETURN              
    VARCHAR(5)
    DECLARE @v_desc              
    VARCHAR(5)
DECLARE @i_volumenumber         INT
SELECT @i_volumenumber = volumenumber
FROM    bookdetail
WHERE   bookkey = @i_bookkey and volumenumber <> 0


IF @i_volumenumber > 0
BEGIN
    SELECT @RETURN = CAST(@i_volumenumber as varchar(5))
END
ELSE
BEGIN
    SELECT @RETURN = ''
END

RETURN @RETURN
END

2 个答案:

答案 0 :(得分:0)

在寻找'0'而不是NULL COALESCE()时没有用,而是使用简单的CASE

select
    ...,
    case bd.seriesvolume when '0' then '' else bd.seriesvolume end as p_seriesvol 
from
    ...

或者如果您想将''0用作NULL

case when bd.seriesvolume is null or bd.seriesvolume = '0' then '' else bd.seriesvolume end as p_seriesvo

答案 1 :(得分:0)

COALESCE() function returns the 1st non null value 

SELECT COALESCE(NULL, NULL, 'third_value', 'fourth_value');返回第三个值,因为第三个值是不为null的第一个值。

因此,在您的情况下,COALESCE(bd.seriesvolume, '') AS p_seriesvol如果seriesvolume列值为null,则它将返回空白字符串