225

MS SQLのWHERE句内でIF句を使用することは可能ですか?

例:

WHERE
    IF IsNumeric(@OrderNumber) = 1
        OrderNumber = @OrderNumber
    ELSE
        OrderNumber LIKE '%' + @OrderNumber + '%'
4

16 に答える 16

240

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

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

または、@ NJ Reedが指摘するような IF ステートメントを使用することもできます。

于 2008-09-17T21:26:39.967 に答える
154

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 を使用して追加の条件を追加するだけです。

于 2008-09-17T21:44:08.897 に答える
40

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

WHERE
    (IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
于 2016-01-22T13:57:16.210 に答える
15

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 番目のアプローチは恐ろしいものですが、そのようなさまざまな条件が多数ある場合に機能するのは、ほぼ唯一の方法です。

于 2008-09-17T21:47:31.913 に答える
6

IF の代わりにCASEステートメントを使用します。

于 2008-09-17T21:25:55.600 に答える
4

CASEステートメントが必要です

WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
于 2008-09-17T21:28:44.720 に答える
3

where ... like / = ... case ...then...ブール値を使用できると思います。T-SQLを使用しています。

シナリオ:boolがfalseの場合はPerson-30の趣味を取得し、boolがtrueの場合は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;
于 2010-12-01T18:24:08.507 に答える
3

// ストアド プロシージャを使用して、国とサイトでフィルター処理されたユーザーを選択する例

CREATE STORED PROCEDURE GetUsers
@CountryId int = null,
@SiteId int = null
AS
BEGIN
SELECT *
        FROM Users
        WHERE
                CountryId  = CASE WHEN ISNUMERIC(@CountryId) = 1 THEN @CountryId ELSE CountryId END AND 
                SiteId     = CASE WHEN ISNUMERIC(@SiteId) = 1 THEN @SiteId ELSE SiteId END END

// 入力 countryId AND/OR siteId が存在する場合はそれを取得し、それ以外の場合はフィルタリングしません

于 2020-12-24T14:22:25.170 に答える
2
WHERE (IsNumeric(@OrderNumber) <> 1 OR OrderNumber = @OrderNumber)
             AND (IsNumber(@OrderNumber) = 1 OR OrderNumber LIKE '%'
                                              + @注文番号 + '%')
于 2011-01-19T21:35:58.310 に答える
1
    WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE  '%' + @OrderNumber END

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

于 2019-07-21T12:17:16.373 に答える
-1
If @LstTransDt is Null
                begin
                    Set @OpenQty=0
                end
            else
                begin
                   Select   @OpenQty=IsNull(Sum(ClosingQty),0)  
                   From  ProductAndDepotWiseMonitoring  
                   Where   Pcd=@PCd And PtpCd=@PTpCd And TransDt=@LstTransDt      
                end 

これが役立つかどうかを確認してください。

于 2013-03-13T06:05:18.020 に答える
-8
USE AdventureWorks2012;
GO
IF 
(SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5
PRINT 'There are more than 5 Touring-3000 bicycles.'
ELSE PRINT 'There are 5 or less Touring-3000 bicycles.' ;
GO
于 2013-04-22T08:42:55.857 に答える