it-swarm-eu.dev

SQL: IF-Klausel innerhalb der WHERE-Klausel

Ist es möglich, eine IF -Klausel in einer WHERE -Klausel in MS SQL zu verwenden?

Beispiel:

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

Verwenden Sie eine CASE Anweisung
UPDATE: Die vorherige Syntax (wie von einigen Leuten hervorgehoben) funktioniert nicht. Sie können CASE folgendermaßen verwenden:

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

Oder Sie können eine IF-Anweisung wie @ N. J. Reed verwenden.

196
bdukes

Dies sollte ohne IF oder CASE möglich sein

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

Abhängig von der SQL-Version müssen Sie möglicherweise die Umsetzungen für die Auftragsnummer in eine INT- oder VARCHAR-Version ändern, je nachdem, ob implizite Umsetzungen unterstützt werden.

Dies ist eine sehr verbreitete Technik in einer WHERE-Klausel. Wenn Sie eine "IF" -Logik in der WHERE-Klausel anwenden möchten, müssen Sie lediglich die zusätzliche Bedingung mit einem booleschen UND zu dem Abschnitt hinzufügen, in dem sie angewendet werden soll.

130
njr101

Sie brauchen überhaupt keine IF-Anweisung.

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

In SQL gibt es keine gute Möglichkeit, dies zu tun. Einige Ansätze, die ich gesehen habe:

1) Verwenden Sie CASE in Kombination mit Booleschen Operatoren:

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) Verwenden Sie IFs außerhalb des SELECT

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

3) Erstellen Sie Ihre SQL-Anweisung unter Verwendung einer langen Zeichenfolge bedingt und verwenden Sie dann EXEC

Der dritte Ansatz ist abscheulich, aber es ist fast der einzige Gedanke, der funktioniert, wenn Sie eine Reihe solcher variabler Bedingungen haben.

13
Euro Micelli

Verwenden Sie eine CASE Anweisung anstelle von IF.

6
Joel Coehoorn

Sie möchten die CASE-Anweisung

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

Ich denke, wo ... wie/= ... case ... dann ... mit Booleanern arbeiten kann. Ich benutze T-SQL.

Szenario: Angenommen, Sie möchten die Hobbys von Person-30 abrufen, wenn bool false ist, und die Hobbys von Person-42, wenn bool true ist. (Laut einigen machen Hobby-Lookups über 90% der Geschäftsberechnungszyklen aus. Bezahlen Sie also genau.).

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
    WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE  '%' + @OrderNumber END

In line case Condition wird ordnungsgemäß funktionieren.

0
Jubayer Hossain

Das folgende Beispiel führt eine Abfrage als Teil des Booleschen Ausdrucks aus und führt dann geringfügig andere Anweisungsblöcke basierend auf dem Ergebnis des Booleschen Ausdrucks aus. Jeder Anweisungsblock beginnt mit BEGIN und endet mit 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

Verwenden verschachtelter IF ... ELSE-Anweisungen Das folgende Beispiel zeigt, wie eine IF ... ELSE-Anweisung in eine andere verschachtelt werden kann. Setzen Sie die Variable @Number auf 5, 50 und 500, um jede Anweisung zu testen.

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 Statement ist die bessere Option als IF always.

  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