2011-07-28 12 views
13

Powiedzmy, że mam funkcję lub procedurę przechowywaną, która przyjmuje kilka parametrów VARCHAR. Stałam zmęczony pisania SQL tak aby sprawdzić, czy te parametry mają wartość:String.IsNullOrEmpty jak funkcja dla VARCHAR w SQL?

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

Musi być lepszy sposób to zrobić. Czy nie ma?

+0

O Boże, powinienem to wiedzieć. Obie odpowiedzi działają, oczywiście. Zaakceptował odpowiedź Joe, od kiedy pisał pierwszy. –

+0

Zobacz mój komentarz na odpowiedź Dereka. –

Odpowiedz

21

Można zrobić ISNULL(@SomeVarcharParam, '') <> '' lub można utworzyć UDF, która zwraca bitowe:

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 

I nazwać używając IF NOT dbo.IsNullOrEmpty(@SomeVarcharParam) BEGIN ...

Należy pamiętać, że podczas wywoływania UDF, ty koniecznością przedrostek jego właściciela (tutaj, dbo.)

+0

Powinieneś był podkreślić 'ISNULL()' trochę bardziej, ponieważ 'COALESCE' używa go, czyniąc' ISNULL() 'bardziej wydajnym. W konsekwencji ['IsNull' jest szybszy] (http://www.bennadel.com/blog/196-SQL-COALESCE-Very-Cool-But-Slower-Than-ISNULL-.htm) –

+0

@Justin Satyr: Adam Machanic [zademonstrowane] (http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx), że "ISNULL" jest tylko 10-12% szybszy niż "COALESCE" i, jego zdaniem, jest "mało warta poświęcenia zgodności funkcjonalnej i standardowej". Ponadto, jak wskazuje Adam w późniejszych komentarzach do artykułu, różnica w SQL Server 2008 jest zupełnie inna i obie mają praktycznie identyczną wydajność. –

+0

@Joe, nie chciałem, aby osoba, która zażądała zmiany, rzeczywiście zmieniła odpowiedź, której zaakceptował ... Tak czy inaczej, * jeśli * to prawda, że ​​'COALESCE' odnosi się do funkcji' ISNULL', nawet jeśli różnica wynosi O (1), 'ISNULL' jest nadal lepszy z tego samego powodu' return true' jest lepszy niż 'return FunctionThatReturnsTrue()'. Jest mniej zbędny. Podczas użytkowania nigdy nie potrzebujesz funkcji wielu wartości COALESCE. Istnieje jednak uzasadniona obawa dotycząca standardów. –

7
IF COALESCE(@SomeVarcharParm, '') <> '' 
BEGIN 
    -- do stuff 
END 
3

Jeśli łączę lub łączę ciąg inline (wewnątrz SELECT) i chcę, aby sprawdzić, czy kolumna jest zerowy lub pusty, to zrobić:

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 na wewnętrznej części wypowiedzi zmusi kolumnę być NULL, jeśli jest pusty, a następnie zewnętrzna ekspresja ISNULL może zależeć od zgodnego wejścia i odpowiednio reagować.

0

Zdaję sobie sprawę, że jest to stare pytanie, ale to, co używam w MSSQL: LEN(ISNULL(@asdf, ''))>0

Przykład:

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 

myślę, że to jest prostsze i bardziej prosta niż innych rozwiązań, ponieważ to jest dosłownie sprawdzanie, czy ciąg znaków ma wartość zerową lub ma długość 0.

1

Oto moja funkcja, która "rozszerza" ISNULL i sprawdza również, czy są puste. Testowana wartość jest sprawdzana pod kątem pustej wartości, a jeśli nie jest pusta, jest przycinana, a następnie sprawdzana pod kątem długości.

Funkcja zwraca ciąg testowy, jeśli NIE jest pusty lub pusty, w przeciwnym razie zwracany jest drugi ciąg.

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

Nie trzeba sprawdzać wartości zerowej przed wywołaniem LEN. Możesz po prostu użyć LEN (@SomeVarcharParm)> 0. To zwróci wartość false, jeśli wartość jest równa NULL, '' lub ''. Dzieje się tak dlatego, że NULL> 0 zwraca false. Przekonaj się uruchomić:

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

Można po prostu zrobić IF @SomeVarcharParam <> '' ponieważ stan oceni do NULL i oddział nie zostanie podjęta, jeśli parametr ma wartość null

0

I upvoted odpowiedź Atron za choć technicznie realizowane IfNullOrWhiteSpace .

Oto moja realizacja 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 
0

Użyj tej funkcji (na podstawie Derek):

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 

jak

dbo.isNullOrEmpty(@someVar) 

lub

WHERE dbo.isNullOrEmpty(@someVar) = 1 

w procedurze przechowywanej lub zapytaniu.

Powiązane problemy