it-swarm.it

SQL: clausola IF all'interno della clausola DOVE

È possibile utilizzare una clausola IF all'interno di a DOVE clausola in MS SQL?

Esempio:

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

Usa una dichiarazione CASE
AGGIORNAMENTO: La sintassi precedente (come indicato da alcune persone) non funziona. È possibile utilizzare CASE come segue:

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

Oppure puoi usare una dichiarazione IF come @ N. J. Reed sottolinea.

193
bdukes

Dovresti essere in grado di farlo senza IF o CASE

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

A seconda dell'aspetto di SQL, potrebbe essere necessario modificare i cast del numero ordine in un INT o VARCHAR a seconda che siano supportati i cast impliciti.

Questa è una tecnica molto comune in una clausola WHERE. Se si desidera applicare una logica "IF" nella clausola WHERE, è sufficiente aggiungere la condizione aggiuntiva con un valore booleano AND alla sezione in cui deve essere applicata.

128
njr101

Non hai bisogno di una dichiarazione IF.

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

Non c'è un buon modo per farlo in SQL. Alcuni approcci che ho visto:

1) Usa CASE combinato con operatori booleani:

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) Usa IF fuori da SELECT

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

3) Utilizzando una stringa lunga, componi la tua istruzione SQL in modo condizionale, quindi usa EXEC

Il terzo approccio è orribile, ma è quasi l'unico che funziona se si dispone di un numero di condizioni variabili del genere.

13
Euro Micelli

Utilizza un'istruzione CASO anziché IF.

6
Joel Coehoorn

Vuoi la dichiarazione CASE

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

Penso che dove ... come/= ... caso ... poi ... possa lavorare con Booleans. Sto usando T-SQL.

Scenario: Diciamo che vuoi ottenere gli hobby di Person-30 se bool è falso, e gli hobby di Person-42 se bool è vero. (Secondo alcuni, le ricerche hobbistiche comprendono oltre il 90% dei cicli di calcolo aziendale, quindi pagate con attenzione).

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;
3
William
 WHERE (IsNumeric (@OrderNumber) <> 1 OR OrderNumber = @OrderNumber) 
 AND (IsNumber (@OrderNumber) = 1 OR OrderNumber LIKE '%' 
 + @OrderNumber + '%') 
1
WhoIsNinja

L'esempio seguente esegue una query come parte dell'espressione booleana e quindi esegue blocchi di istruzioni leggermente diversi in base al risultato dell'espressione booleana. Ogni blocco di istruzioni inizia con BEGIN e termina 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

Utilizzo di istruzioni IF ELSE nidificate L'esempio seguente mostra come un'istruzione IF ... ELSE può essere nidificata all'interno di un'altra. Impostare la variabile @Number su 5, 50 e 500 per testare ciascuna istruzione.

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
0
hossein

CASO Istruzione è l'opzione migliore di SE sempre.

  WHERE  vfl.CreatedDate >= CASE WHEN @FromDate IS NULL THEN vfl.CreatedDate ELSE  @FromDate END
    AND vfl.CreatedDate<=CASE WHEN @ToDate IS NULL THEN vfl.CreatedDate ELSE @ToDate END 
0
Majedur Rahaman