String.IsNullOrEmpty как функция для VARCHAR в SQL?
Скажем, у меня есть функция или хранимая процедура, которая принимает несколько параметров VARCHAR. Я устал от написания SQL, как это, чтобы проверить, имеют ли эти параметры значение:
IF @SomeVarcharParm IS NOT NULL AND LEN(@SomeVarcharParm) > 0
BEGIN
-- do stuff
END
Там должен быть лучший способ сделать это. Не существует?
Ответы
Ответ 1
Вы можете сделать 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.)
Ответ 2
IF COALESCE(@SomeVarcharParm, '') <> ''
BEGIN
-- do stuff
END
Ответ 3
Если я конкатенирую или объединяю строку inline (внутри оператора select), и я хочу проверить, является ли столбец NULL или Empty, я делаю это:
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 во внутренней части выражения заставит столбец быть NULL, если он пуст, тогда внешнее выражение ISNULL может зависеть от последовательного ввода и соответственно реагировать.
Ответ 4
Вот моя функция, которая "расширяет" ISNULL и также проверяет наличие пустого. Значение теста проверяется на нуль, а если оно не равно null, оно обрезается, а затем проверяется на длину.
Функция возвращает тестовую строку, если она NOT Null или Empty, в противном случае возвращается вторая строка.
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
Ответ 5
Я понимаю, что это старый вопрос, но это то, что я использую в 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.
Ответ 6
Вам не нужно проверять значение null перед вызовом 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
Ответ 7
Вы можете просто сделать IF @SomeVarcharParam <> ''
, поскольку условие будет оцениваться до NULL
, и ветка не будет принята, если параметр имеет значение null
Ответ 8
Я поддержал ответ Атрона, хотя он технически реализовал 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
Ответ 9
Используйте эту функцию (на основе Derek's):
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
в хранимой процедуре или запросе.