пусто вместо нуля - PullRequest
       1

пусто вместо нуля

4 голосов
/ 03 ноября 2011
Duration = isnull(FunctionA(DateA,DateB),'')

Приведенная выше функция рассчитывает количество дней, и если день равен нулю, отображается значение 0 вместо пустого значения

Как я могу изменить приведенный выше код, чтобы он показывал пустой, а не 0 для значения NULL?

Ответы [ 5 ]

8 голосов
/ 03 ноября 2011

Если ваша функция возвращает целое число, результат от isnull также будет целым числом. В случае, если возвращаемое значение равно null, у вас будет неявное преобразование в целое число для '', и это будет 0.

Попробуйте это:

declare @xx int
select isnull(@xx,'')

Результат:

-----------
0

Вы можете получить пробел, если сначала приведете возвращаемое значение из вашей функции к varchar.

declare @xx int
select isnull(cast(@xx as varchar(10)),'')

Результат:

----------
                                                                                .

Если ваша функция возвращает 0 вместо null, вы можете использовать nullif, чтобы получить нулевое значение, прежде чем приводить к varchar.

declare @xx int = 0
select isnull(cast(nullif(@xx, 0) as varchar(10)),'')

Резюме :

Вам нужно это:

Duration = isnull(cast(FunctionA(DateA,DateB) as varchar(10)),'')

или это

Duration = isnull(cast(nullif(FunctionA(DateA,DateB), 0) as varchar(10)),'')
2 голосов
/ 03 ноября 2011

Если Duration имеет тип данных int, вы не можете изменить его на пустую строку (пустую). Вам придется либо изменить его на строковый тип данных (например, varchar), либо все будет в порядке с 0. int может быть либо NULL (если это разрешено), либо допустимым целочисленным значением. Пустая строка не является допустимым целочисленным значением.

1 голос
/ 08 марта 2016

Я использую операторы case и приведение для этого.

Пример: случай, когда columnX <> 0 затем приводится (columnX как nvarchar), иначе '' end

По сути, вы меняете числовое значение, чтобы оно отображалось либо как символ, либо как пробел.Вы должны будете выполнить всю свою математику, прежде чем перейти на nvarchar, потому что вне этого он становится строкой.Было бы полезно, если бы BLANK был командой и работал с числовыми значениями.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 03 ноября 2011

Вы можете объявить Duration как тип данных sql_variant и разрешить неявное преобразование так что-то вроде этого должно работать

объявить @DURATION sql_variant

выберите COALESCE (@DURATION, '')

set @ DURATION = 1

выберите COALESCE (@DURATION, '')

0 голосов
/ 03 ноября 2011

Функция A возвращает 0 вместо нуля? Код, который вы написали, может быть в порядке, но если FunctionA никогда не возвращает null, тогда ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...