it-swarm-eu.dev

SQL: IF klauzule v klauzuli WHERE

Je možné použít klauzuli IF v klauzuli WHERE v MS SQL?

Příklad:

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

Použijte příkaz CASE
UPDATE: Předchozí syntaxe (jak zdůraznilo několik lidí) nefunguje. Případ můžete použít následovně:

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

Nebo můžete použít příkaz IF jako @ N. J. Reed upozorňuje.

193
bdukes

Měli byste být schopni to udělat bez jakéhokoli IF nebo CASE

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

V závislosti na chuti SQL budete možná muset vyladit obsazení na objednávkovém čísle na INT nebo VARCHAR v závislosti na tom, zda jsou podporovány implicitní obsazení.

Toto je velmi běžná technika v klauzuli WHERE. Pokud chcete v klauzule WHERE použít nějakou logiku „IF“, vše, co musíte udělat, je přidat další podmínku s booleovským AND do sekce, kde je třeba ji použít.

128
njr101

Vůbec nepotřebujete prohlášení IF.

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

V SQL není dobrý způsob, jak toho dosáhnout. Některé přístupy, které jsem viděl:

1) Používejte CASE v kombinaci s booleovskými operátory:

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) Použijte IF mimo SELECT

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

3) Pomocí dlouhého řetězce podmíněně vytvořte příkaz SQL a poté použijte EXEC

Třetí přístup je odporný, ale je to téměř jediné, co funguje, pokud máte řadu podobných proměnných.

13
Euro Micelli

Místo IF použijte příkaz CASE .

6
Joel Coehoorn

Chcete příkaz CASE

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

Myslím, že kde ... jako/= ... případ ... pak ... může pracovat s Booleans. Používám T-SQL.

Scénář: Řekněme, že chcete získat koníčky Person-30, pokud je bool nepravdivý, a koníčky Person-42, pokud je bool pravda. (Podle některých zahrnuje vyhledávání koníčků více než 90% obchodních výpočtových cyklů, proto věnujte pozornost.).

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

Následující příklad provede dotaz jako součást logického výrazu a poté na základě výsledku logického výrazu provede mírně odlišné bloky příkazů. Každý blok příkazu začíná BEGIN a končí 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

Použití vnořených příkazů IF ... ELSE Následující příklad ukazuje, jak lze příkaz IF… ELSE vnořit do jiného. Chcete-li otestovat každý příkaz, nastavte proměnnou @Number na 5, 50 a 500.

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

CASE Příkaz je lepší volba než IF vždy.

  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