String.IsNullOrEmpty как функция для VARCHAR в SQL? - PullRequest
17 голосов
/ 28 июля 2011

Скажем, у меня есть функция или хранимая процедура, которая принимает несколько параметров VARCHAR. Я устал писать SQL, как это, чтобы проверить, имеют ли эти параметры значение:

IF @SomeVarcharParm IS NOT NULL AND LEN(@SomeVarcharParm) > 0
BEGIN
    -- do stuff
END

Должен быть лучший способ сделать это. Разве нет?

Ответы [ 9 ]

25 голосов
/ 28 июля 2011

Вы можете сделать ISNULL(@SomeVarcharParam, '') <> '' или создать UDF, который возвращает бит:

create function dbo.IsNullOrEmpty(@x varchar(max)) returns bit as
BEGIN
IF @SomeVarcharParm IS NOT NULL AND LEN(@SomeVarcharParm) > 0
    RETURN 0
ELSE
    RETURN 1
END

И назовите это используя IF NOT dbo.IsNullOrEmpty(@SomeVarcharParam) BEGIN ...

Имейте в виду, что при вызове UDF вы ДОЛЖНЫ ставить префикс его владельца (здесь, dbo.)

12 голосов
/ 28 июля 2011
IF COALESCE(@SomeVarcharParm, '') <> ''
BEGIN
   -- do stuff
END
5 голосов
/ 26 февраля 2013

Если я объединяю или объединяю строку в строке (в операторе select) и хочу проверить, равен ли столбец NULL или Пусто, я делаю это:

ISNULL('starting to build string ' 
+ NULLIF(some_table..some_col_that_might_be_null_or_empty, '')
, 'string to append if the resulting concatenation is null')

NULLIF навнутренняя часть выражения заставит столбец быть пустым, если он пустой, то внешнее выражение ISNULL может зависеть от согласованного ввода и реагировать соответствующим образом.

1 голос
/ 22 декабря 2016

Я проголосовал за ответ Атрона, хотя он технически реализовал IfNullOrWhiteSpace.

Вот моя реализация IfNullOrEmpty():

IF EXISTS (SELECT * FROM sys .objects WHERE object_id = OBJECT_ID(N'[dbo].[IfNullOrEmpty]' ) and type in ( N'FN'))
    DROP FUNCTION dbo.IfNullOrEmpty
go

CREATE FUNCTION dbo.IfNullOrEmpty(@value varchar(max), @substitute varchar(max)) returns varchar(max) as
BEGIN
    IF @value IS NOT NULL AND LEN(@value) > 0
        RETURN @value
    RETURN @substitute  
END
1 голос
/ 14 мая 2015

Вот моя функция, которая «расширяет» ISNULL и также проверяет наличие пустых значений. Тестовое значение проверяется на нулевое значение, и если оно не равно нулю, оно обрезается, а затем проверяется на длину.

Функция возвращает тестовую строку, если она НЕ пуста или пуста, в противном случае возвращается вторая строка.

CREATE FUNCTION [dbo].[ISNULLOREMPTY]
(   
    @value NVARCHAR(max),
    @return NVARCHAR(max)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN 

IF (@value IS NULL)
BEGIN
    RETURN @return
END
ELSE
BEGIN
    IF (LEN(LTRIM(@value)) = 0)
    BEGIN 
        RETURN @return
    END 
END

RETURN @value;
END
GO
0 голосов
/ 19 мая 2017

Используйте эту функцию (на основе Дерека):

CREATE FUNCTION dbo.isNullOrEmpty(@x varchar(max)) RETURNS BIT AS
BEGIN
    IF @x IS NOT NULL AND LEN(@x) > 0
        RETURN 0

    RETURN 1
END

как

dbo.isNullOrEmpty(@someVar)

или

WHERE dbo.isNullOrEmpty(@someVar) = 1

в хранимой процедуре или запросе.

0 голосов
/ 14 сентября 2015

Вы можете просто сделать IF @SomeVarcharParam <> '', поскольку условие оценивается как NULL, и ветвь не будет принята, если параметр имеет значение null

0 голосов
/ 14 сентября 2015

Вам не нужно проверять нулевое значение перед вызовом LEN.Вы можете просто использовать LEN (@SomeVarcharParm)> 0. Это вернет false, если значение равно NULL, '' или ''.Это потому, что NULL> 0 возвращает false.Смотрите сами, бегите:

SELECT 
 CASE WHEN NULL > 0 THEN 'NULL > 0 = true' ELSE 'NULL > 0 = false' END,
 CASE WHEN LEN(NULL) > 0 THEN 'LEN(NULL) = true' ELSE 'LEN(NULL) = false' END,
 CASE WHEN LEN('') > 0 THEN 'LEN('''') > 0 = true' ELSE 'LEN('''') > 0 = false' END,
 CASE WHEN LEN(' ') > 0 THEN 'LEN('' '') > 0 = true' ELSE 'LEN('' '') > 0 = false' END,
 CASE WHEN LEN(' test ') > 0 THEN 'LEN('' test '') > 0 = true' ELSE 'LEN('' test '') > 0 = false' END
0 голосов
/ 16 октября 2014

Я понимаю, что это старый вопрос, но это то, что я использую в MSSQL: LEN(ISNULL(@asdf, ''))>0

Пример:

DECLARE @asdf varchar(10)
SET @asdf = NULL --You can change this value to test different outputs

BEGIN IF LEN(ISNULL(@asdf, '')) > 0
   PRINT @asdf
ELSE
   PRINT 'IS NullOrEmpty'
END

--You can use it inline like this:
PRINT CASE LEN(ISNULL(@asdf, '')) WHEN 0 THEN 'IS NullOrEmpty' ELSE @asdf END

Я думаю, что это проще и прямолинейнее, чем другие решения, потому что он буквально проверяет, является ли строка нулевой или имеет длину 0.

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