SQL COALESCE и IS NULL не возвращают пробел, когда запрос возвращает NULL - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь оптимизировать огромный запрос SQL, который был написан разработчиком-самоучкой, который использовал тонну функций вместо JOINS.В любом случае, у меня возникают проблемы с отображением пробела или пустой строки (''), когда в выбранном поле нет значения.Я включил только SELECT в вопросе.У меня самая странная проблема или я просто пропускаю правильный ответ при устранении неполадок.Всякий раз, когда я использую COALESCE, когда поле должно быть пустой строкой, оно отображает ноль.И когда я использую IS NULL, я возвращаю NULL.Вся информация в Интернете, кажется, указывает на использование COALESCE (значение, ''), как показано в коде.Но я получаю 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

Функция

.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 голосов
/ 19 октября 2018
COALESCE() function returns the 1st non null value 

SELECT COALESCE(NULL, NULL, 'third_value', 'fourth_value'); возвращает третье значение, потому что третье значение является первым значением, которое не является нулевым.

Так что в вашем случае COALESCE(bd.seriesvolume, '') AS p_seriesvol, если значение столбца seriesvolume равно нулю, тогда оно будетвернуть пустую строку

0 голосов
/ 19 октября 2018

Поскольку вы ищете '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
...