2011-07-28 14 views
13

Supongamos que tengo una función o procedimiento almacenado que toma varios parámetros de VARCHAR. Me he cansado de escribir SQL como este para probar si estos parámetros tienen un valor:String.IsNullOrEmpty like function para VARCHARs en SQL?

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

Tiene que haber una mejor manera de hacer esto. ¿No hay?

+0

Gosh, debería haber sabido eso. Ambas respuestas funcionan, por supuesto. Aceptó la respuesta de Joe desde que publicó primero. –

+0

Ver mi comentario sobre la respuesta de Derek. –

Respuesta

21

Usted puede hacer ISNULL(@SomeVarcharParam, '') <> '' o puede crear una UDF que devuelve un poco:

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 

Y llama a que el uso de IF NOT dbo.IsNullOrEmpty(@SomeVarcharParam) BEGIN ...

Tenga en cuenta que cuando se llama a una UDF, que MUST prefijo el propietario (aquí, dbo.)

+0

Debería haber enfatizado el 'ISNULL()' un poco más porque 'COALESCE' lo usa, por lo tanto,' ISNULL() 'es más eficiente. Consecuentemente, ['IsNull' es más rápido] (http://www.bennadel.com/blog/196-SQL-COALESCE-Very-Cool- But-Slower-Than-ISNULL-.htm) –

+0

@Justin Satyr: Adam Machanic [demostrado] (http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx) que el 'ISNULL' es solo un 10-12% más rápido que' COALESCE' y, en sus palabras, es "No vale la pena la funcionalidad y el cumplimiento del estándar de sacrificio". Además, como Adam indica en comentarios posteriores sobre el artículo, la diferencia se ha eliminado por completo en SQL Server 2008 y ambos tienen un rendimiento prácticamente idéntico. –

+0

@Joe, no quise que el solicitante cambiara realmente la respuesta que aceptó ... En cualquier caso, * si * es cierto que 'COALESCE' se refiere a la función' ISNULL', incluso si la diferencia es O (1), 'ISNULL' es aún mejor por el mismo motivo' return true' es mejor que 'return FunctionThatReturnsTrue()'. Es menos redundante En su uso, nunca necesita la funcionalidad de valor múltiple de 'COALESCE'. Pero existe una preocupación válida con respecto a los estándares. –

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

Si estoy concatenando o fusionando una cadena en línea (dentro de una instrucción de selección), y quiero comprobar si la columna es nulo o vacío, hago esto:

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') 

El NULLIF en la parte interna de la expresión obligará a la columna a ser NULL si está vacío, entonces la expresión ISNULL externa puede depender de la entrada constante y reaccionar en consecuencia.

0

Comprendo que esto es una vieja pregunta, pero esto es lo que utilizo en MSSQL: LEN(ISNULL(@asdf, ''))>0

Ejemplo:

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 

creo que esto es más simple y más sencillo que las otras soluciones porque está literalmente comprobando si la cadena es nula o tiene una longitud de 0.

1

Aquí está mi función que "extiende" ISNULL y también comprueba si está vacía. El valor de prueba se comprueba como nulo y, si no es nulo, se recorta y luego se comprueba su longitud.

La función devuelve la cadena de prueba si NO es nula o está vacía, de lo contrario, se devuelve la segunda cadena.

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

No necesita comprobar si falta antes de llamar a LEN. Puede usar LEN (@SomeVarcharParm)> 0. Esto devolverá falso si el valor es NULL, '' o ''. Esto es porque NULL> 0 devuelve falso. Ver por sí mismo ejecute:

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

Sólo puede hacer IF @SomeVarcharParam <> '' ya que la condición se evalúa como NULL y no será tomado la sucursal si el parámetro es nulo

0

I upvoted respuesta de Atron pesar de que técnicamente implementado IfNullOrWhiteSpace .

Aquí es mi implementación de 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

Utilice esta función (en base a 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 

como

dbo.isNullOrEmpty(@someVar) 

o

WHERE dbo.isNullOrEmpty(@someVar) = 1 

en un procedimiento almacenado o una consulta.

Cuestiones relacionadas