我正在尝试优化一个庞大的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
答案 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,则它将返回空白字符串