web-dev-qa-db-ja.com

WHERE句内のSQL:IF句

MS SQLのWHERE句内でIF句を使用することはできますか

例:

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

CASE ステートメントを使用する
UPDATE:前の構文(数人が指摘したように)は機能しません。次のようにCASEを使うことができます。

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

あるいは@ NのようなIFステートメントを使用することもできます。 J.リード が指摘する。

193
bdukes

あなたはどんなIFまたはCASEなしでこれをすることができるはずです

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

SQLの種類によっては、暗黙的キャストがサポートされているかどうかに応じて、オーダー番号のキャストをINTまたはVARCHARに微調整する必要があります。

これはWHERE句で非常に一般的な手法です。 WHERE句に "IF"ロジックを適用したい場合は、適用する必要があるセクションにブールANDを使用して追加の条件を追加するだけです。

128
njr101

IFステートメントはまったく必要ありません。

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

SQLでこれを行うための良い方法はありません。私が見たいくつかのアプローチ:

1)CASEとブール演算子を組み合わせて使用​​します。

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)SELECTの外側でIFを使う

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

3)長い文字列を使用して、条件付きでSQL文を作成してから、EXECを使用します。

3番目のアプローチはひどいですが、それがあなたがそのようないくつかの可変的な条件を持っているならばうまくいく唯一の考えです。

13
Euro Micelli

IFの代わりに CASE ステートメントを使用してください。

6
Joel Coehoorn

あなたはCASE文が欲しい

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

どこで... like/= ... case ...それから... Booleansで動作できるかと思います。私はT-SQLを使っています。

シナリオ:boolが偽の場合はPerson-30の趣味、Boolが真の場合はPerson-42の趣味を取得したいとします。 (一部の人によると、趣味検索はビジネス計算サイクルの90%以上を占めているので、慎重に支払ってください)。

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

行の場合、条件は適切に機能します。

0
Jubayer Hossain

次の例では、ブール式の一部としてクエリを実行してから、ブール式の結果に基づいてわずかに異なるステートメントブロックを実行します。各文ブロックはBEGINで始まり、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

ネストしたIF ... ELSE文の使用次の例は、IF…ELSE文を他の文の中にネストする方法を示しています。各ステートメントをテストするには、@ Number変数を5、50、および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ステートメントは常にIFよりもオプションです。

  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