it-swarm-tr.com

SQL: IF cümlesi WHERE deyimi içinde

Bir EĞER yan tümcesini bir IÇINDE KULLANMAK MÜMKÜN MÜ? _ MS SQL'de yan tümce?

Örnek:

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

Bir CASE ifadesi kullanın
GÜNCELLEME: Önceki sözdizimi (birkaç kişinin belirttiği gibi) çalışmaz. CASE'i aşağıdaki gibi kullanabilirsiniz:

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

Veya @ N. J. Reed işaret ettiği gibi bir IF ifadesi kullanabilirsiniz.

196
bdukes

Bunu herhangi bir IF veya CASE olmadan yapabilmeniz gerekir.

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

SQL'in tadına bağlı olarak, gizli yayınların desteklenip desteklenmediğine bağlı olarak, sipariş numarasındaki yayınları bir INT veya VARCHAR'a ayarlamaya gerek duyabilirsiniz.

WHERE yan tümcesinde bu çok yaygın bir tekniktir. WHERE yan tümcesinde bazı "IF" mantığı uygulamak istiyorsanız, yapmanız gereken tek şey bir boolean ile ekstra koşulu eklemek ve uygulanması gereken bölüme eklemektir.

130
njr101

IF ifadesine hiç ihtiyacınız yok.

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

Bunu SQL'de yapmanın iyi bir yolu yok. Gördüğüm bazı yaklaşımlar:

1) Boole işleçleriyle birleştirilmiş CASE kullanın:

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) IF’leri SELECT dışında kullanın.

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

3) Uzun bir dizge kullanarak, SQL deyiminizi koşullu olarak oluşturun ve ardından EXEC kullanın.

Üçüncü yaklaşım iğrençtir, ancak bunun gibi değişken koşullarınız varsa işe yarayan tek şey budur.

13
Euro Micelli

IF yerine bir CASE ifadesi kullanın.

6
Joel Coehoorn

CASE ifadesini istiyorsun

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

Bence ... .../= ... davası ... sonra ... Boolean'larla çalışabilir. T-SQL kullanıyorum.

Senaryo: Diyelim ki, eğer bool yanlışsa, Person-30'un hobilerini ve bool doğru ise, Person-42'nin hobilerini almak istiyorsunuz. (Bazılarına göre, hobi aramaları iş hesaplama döngülerinin% 90'ından fazlasını oluşturuyor, bu yüzden yakın ödeme yapın.).

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
 NEREDE (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

Hat durumunda Koşul düzgün çalışacaktır.

0
Jubayer Hossain

Aşağıdaki örnek, Boolean ifadesinin bir parçası olarak bir sorgu yürütür ve ardından Boolean ifadesinin sonucuna bağlı olarak biraz farklı ifade blokları yürütür. Her bir ifade bloğu BEGIN ile başlar ve END ile tamamlanır.

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

Yuvalanmış IF ... ELSE deyimlerini kullanma Aşağıdaki örnek, bir IF… ELSE deyiminin başka bir içine nasıl yerleştirilebileceğini gösterir. Her ifadeyi test etmek için @Number değişkenini 5, 50 ve 500 olarak ayarlayı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
0
hossein

CASE Beyanı her zaman ISE durumundan daha iyidir.

  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