when uso query dentro clausula sql sql-server tsql

uso - Cláusula SQL: IF dentro de la cláusula WHERE



sql server if en el where (11)

Creo que donde ... como / = ... caso ... entonces ... puede trabajar con Booleanos. Estoy usando T-SQL.

Escenario: supongamos que desea obtener los pasatiempos de Person-30 si bool es falso, y los pasatiempos de Person-42 si bool es verdadero. (Según algunos, las búsquedas de pasatiempos comprenden más del 90% de los ciclos de computación de negocios, así que pague de cerca).

CREATE PROCEDURE sp_Case @bool bit AS SELECT Person.Hobbies FROM Person WHERE Person.ID = case @bool when 0 then 30 when 1 then 42 end;

¿Es posible utilizar una cláusula IF dentro de una cláusula WHERE en MS SQL?

Ejemplo:

WHERE IF IsNumeric(@OrderNumber) = 1 OrderNumber = @OrderNumber ELSE OrderNumber LIKE ''%'' + @OrderNumber + ''%''


Debería poder hacer esto sin ningún IF o CASE

WHERE (IsNumeric(@OrderNumber) AND (CAST OrderNumber AS VARCHAR) = (CAST @OrderNumber AS VARCHAR) OR (NOT IsNumeric(@OrderNumber) AND OrderNumber LIKE (''%'' + @OrderNumber))

Dependiendo del sabor de SQL, puede que necesite ajustar los moldes en el número de orden a INT o VARCHAR dependiendo de si los moldes implícitos son compatibles.

Esta es una técnica muy común en una cláusula WHERE. Si desea aplicar alguna lógica "IF" en la cláusula WHERE, todo lo que necesita hacer es agregar la condición adicional con un booleano Y a la sección donde se debe aplicar.


El siguiente ejemplo ejecuta una consulta como parte de la expresión booleana y luego ejecuta bloques de instrucciones ligeramente diferentes en función del resultado de la expresión booleana. Cada bloque de instrucción comienza con BEGIN y finaliza con END.

USE AdventureWorks2012; GO DECLARE @AvgWeight decimal(8,2), @BikeCount int IF (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE ''Touring-3000%'' ) > 5 BEGIN SET @BikeCount = (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE ''Touring-3000%''); SET @AvgWeight = (SELECT AVG(Weight) FROM Production.Product WHERE Name LIKE ''Touring-3000%''); PRINT ''There are '' + CAST(@BikeCount AS varchar(3)) + '' Touring-3000 bikes.'' PRINT ''The average weight of the top 5 Touring-3000 bikes is '' + CAST(@AvgWeight AS varchar(8)) + ''.''; END ELSE BEGIN SET @AvgWeight = (SELECT AVG(Weight) FROM Production.Product WHERE Name LIKE ''Touring-3000%'' ); PRINT ''Average weight of the Touring-3000 bikes is '' + CAST(@AvgWeight AS varchar(8)) + ''.'' ; END ; GO

Uso de sentencias IF ... ELSE anidadas El siguiente ejemplo muestra cómo se puede anidar una instrucción IF ... ELSE dentro de otra. Establezca la variable @Number en 5, 50 y 500 para probar cada instrucción.

DECLARE @Number int SET @Number = 50 IF @Number > 100 PRINT ''The number is large.'' ELSE BEGIN IF @Number < 10 PRINT ''The number is small'' ELSE PRINT ''The number is medium'' END ; GO


No hay una buena manera de hacer esto en SQL. Algunos enfoques que he visto:

1) Use CASE combinado con operadores booleanos:

WHERE OrderNumber = CASE WHEN (IsNumeric(@OrderNumber) = 1) THEN CONVERT(INT, @OrderNumber) ELSE -9999 -- Some numeric value that just cannot exist in the column END OR FirstName LIKE CASE WHEN (IsNumeric(@OrderNumber) = 0) THEN ''%'' + @OrderNumber ELSE '''' END

2) Use IF fuera de SELECT

IF (IsNumeric(@OrderNumber)) = 1 BEGIN SELECT * FROM Table WHERE @OrderNumber = OrderNumber END ELSE BEGIN SELECT * FROM Table WHERE OrderNumber LIKE ''%'' + @OrderNumber END

3) Usando una cadena larga, redacte su instrucción SQL condicionalmente, y luego use EXEC

El tercer enfoque es espantoso, pero es casi lo único que funciona si tienes varias condiciones variables como esa.


No necesita una declaración IF en absoluto.

WHERE (IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber) OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE ''%'' + @OrderNumber + ''%'')


Quieres la sentencia CASE

WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE ''%'' + @OrderNumber END


Use una declaración CASE
ACTUALIZACIÓN: la sintaxis anterior (como lo señalaron algunas personas) no funciona. Puede usar CASE de la siguiente manera:

WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE ''%'' + @OrderNumber END

O puede usar una instrucción IF como @ NJ Reed señala.


Use una instrucción CASE lugar de IF.


WHERE (IsNumeric(@OrderNumber) <> 1 OR OrderNumber = @OrderNumber) AND (IsNumber(@OrderNumber) = 1 OR OrderNumber LIKE ''%'' + @OrderNumber + ''%'')


If @LstTransDt is Null begin Set @OpenQty=0 end else begin Select @OpenQty=IsNull(Sum(ClosingQty),0) From ProductAndDepotWiseMonitoring Where Pcd=@PCd And PtpCd=@PTpCd And TransDt=@LstTransDt end

Vea si esto ayuda.


USE AdventureWorks2012; GO IF (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE ''Touring-3000%'' ) > 5 PRINT ''There are more than 5 Touring-3000 bicycles.'' ELSE PRINT ''There are 5 or less Touring-3000 bicycles.'' ; GO