MS SQLのWHERE句内でIF句を使用することは可能ですか?
例:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
MS SQLのWHERE句内でIF句を使用することは可能ですか?
例:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
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 を使用して追加の条件を追加するだけです。
IF ステートメントはまったく必要ありません。
WHERE
(IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
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 番目のアプローチは恐ろしいものですが、そのようなさまざまな条件が多数ある場合に機能するのは、ほぼ唯一の方法です。
IF の代わりにCASEステートメントを使用します。
CASEステートメントが必要です
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
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;
// ストアド プロシージャを使用して、国とサイトでフィルター処理されたユーザーを選択する例
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 が存在する場合はそれを取得し、それ以外の場合はフィルタリングしません
WHERE (IsNumeric(@OrderNumber) <> 1 OR OrderNumber = @OrderNumber) AND (IsNumber(@OrderNumber) = 1 OR OrderNumber LIKE '%' + @注文番号 + '%')
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE '%' + @OrderNumber END
行の場合、条件は適切に機能します。
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
これが役立つかどうかを確認してください。
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