[sql] SQL : WHERE 절 내의 IF 절

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;