[SQL] SQL : WHERE 절 내에서 IF 절
SQLSQL : WHERE 절 내에서 IF 절
그것은 MS SQL에서 WHERE 절 내에서 IF 절을 사용할 수 있습니까?
예:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
해결법
-
==============================
1.case 문을 사용하여 UPDATE : (몇 사람에 의해 지적) 이전 구문은 작동하지 않습니다. 다음과 같이 CASE를 사용할 수 있습니다 :
case 문을 사용하여 UPDATE : (몇 사람에 의해 지적) 이전 구문은 작동하지 않습니다. 다음과 같이 CASE를 사용할 수 있습니다 :
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE '%' + @OrderNumber END
또는 당신은 @N 같은 IF 문을 사용할 수 있습니다. J. 리드는 지적한다.
-
==============================
2.당신은 어떤 IF 또는 CASE없이이 작업을 수행 할 수 있어야한다
당신은 어떤 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"논리를 적용 할 경우, 당신은 부울로하고 적용 할 필요가있는 섹션에 추가 조건을 추가하기 만하면됩니다.
-
==============================
3.당신은 모든에서 IF 문을 필요가 없습니다.
당신은 모든에서 IF 문을 필요가 없습니다.
WHERE (IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber) OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
-
==============================
4.SQL에서이 작업을 수행 할 수있는 좋은 방법이 없습니다. 일부는 내가 본 접근 :
SQL에서이 작업을 수행 할 수있는 좋은 방법이 없습니다. 일부는 내가 본 접근 :
1) 사용 사례는 부울 연산자와 결합 :
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 (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 방식은 끔찍한이지만, 거의 유일한의이 같은 변수 조건의 숫자가있는 경우 그 일을 생각합니다.
-
==============================
5.대신 IF의 CASE 문을 사용합니다.
대신 IF의 CASE 문을 사용합니다.
-
==============================
6.당신은 CASE 문을 원하는
당신은 CASE 문을 원하는
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
-
==============================
7.내가 생각하는 곳 ... 그런 / = ... 경우 ... 다음 ... 부울 작업 할 수 있습니다. 나는 T-SQL을 사용하고 있습니다.
내가 생각하는 곳 ... 그런 / = ... 경우 ... 다음 ... 부울 작업 할 수 있습니다. 나는 T-SQL을 사용하고 있습니다.
시나리오 : 부울에 해당하는 경우하자의이 부울이 false 인 경우 당신은 사람-30의 취미를 얻고 싶은 말을하고, 사람-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;
-
==============================
8.
WHERE (IsNumeric(@OrderNumber) <> 1 OR OrderNumber = @OrderNumber) AND (IsNumber(@OrderNumber) = 1 OR OrderNumber LIKE '%' + @OrderNumber + '%')
-
==============================
9.다음은 부울 표현식의 일부로서 질의를 실행하고 부울 식의 결과에 기초하여 약간 다를 문 블록을 실행한다. 각 명령문 블록은 BEGIN과 END로 완료로 시작합니다.
다음은 부울 표현식의 일부로서 질의를 실행하고 부울 식의 결과에 기초하여 약간 다를 문 블록을 실행한다. 각 명령문 블록은 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 문이 다른 안에 중첩 할 수있는 방법을 다음의 예를 보여줍니다. 각 문장을 테스트하기 위해 5, 50, 500에 @number 변수를 설정합니다.
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
-
==============================
10.
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
-
==============================
11.
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE '%' + @OrderNumber END
라인의 경우 조건이 제대로 작동합니다.
-
==============================
12.
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
이 도움이되는지 확인합니다.
-
==============================
13.
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
from https://stackoverflow.com/questions/87821/sql-if-clause-within-where-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL의 오류 때 DATE 또는 DATETIME에 대한 기본 값을 설정 (0) | 2020.03.25 |
---|---|
[SQL] SELECT 문에서 NOLOCK 힌트의 효과 (0) | 2020.03.25 |
[SQL] 여러 테이블에서 COUNT (*)를 선택 (0) | 2020.03.25 |
[SQL] ROW_NUMBER 대 SQL RANK () () (0) | 2020.03.25 |
[SQL] 보관 JSON 데이터베이스 대에 각 키에 대한 새 열을 가진 (0) | 2020.03.25 |