MS SQL 의 WHERE 절 내에서 IF 절 을 사용할 수 있습니까?
예:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
답변
CASE 문 사용
UPDATE : 이전 구문 (몇 사람이 지적한대로)이 작동하지 않습니다. 다음과 같이 CASE를 사용할 수 있습니다.
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber) = 1 THEN
@OrderNumber
ELSE
'%' + @OrderNumber
END
또는 @ NJ Reed 와 같은 IF 문을 사용할 수 있습니다 .
답변
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를 사용하십시오.
세 번째 접근 방식은 끔찍하지만, 여러 가지 가변 조건이있는 경우 효과가있는 유일한 방법입니다.
답변
IF 대신 CASE 문을 사용하십시오 .
답변
CASE 문을 원합니다
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
답변
where … like / = … case … then … 부울과 함께 작동 할 수 있다고 생각합니다. 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;