OR은 SQL Server에서 CASE 문으로 지원되지 않습니다


답변:


1079

이 형식을 사용하려면 다음 중 하나를 사용해야합니다.

CASE ebv.db_no 
  WHEN 22978 THEN 'WECS 9500' 
  WHEN 23218 THEN 'WECS 9500'  
  WHEN 23219 THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

그렇지 않으면 다음을 사용하십시오.

CASE  
  WHEN ebv.db_no IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

9
두 번째 경우, 왜 '='가 아닌 'IN'만 작동합니까?

25
=단일 값과 비교하면 효과가 있습니다. 그러나 (22978, 23218, 23219)배열이며 IN값 중 하나만 일치해야합니다.
LdTrigger

2
t-sql은 case 문에서 "or"를 처리 할 수 ​​없습니다. 완구 데이터베이스 상태에서 성장할 Microsoft의 시대가 왔습니다.
Rich Bianco

1
"사례 진술에서"또는 "을 처리 할 수 ​​없습니다".. hmmm .... 스위치가 어떤 언어로든 "또는"을 받아 들인 것을 본 적이 없다고 생각합니다. 스위치의 목적을 어기는 것 같습니다. 어떤 언어가 어떤 경우에 "또는"을 받아들입니까?
Heriberto Lugo

2
@Heriberto Lugo 나는 당신이 얼마나 많은 언어를 알고 있는지 모르지만 적어도 몇 가지가 있습니다. VB.NET과 C #은 간단한 쉼표 구분으로 사용할 수 있습니다. 동일한 코드를 여러 번 반복하지 않아도되므로 아무것도 패배시키지 않습니다.
Johnny Prescott

249
CASE
  WHEN ebv.db_no = 22978 OR 
       ebv.db_no = 23218 OR
       ebv.db_no = 23219
  THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

38
upvoted-이 응답은 가치를 더합니다. OP의 질문에 더 잘 맞으며 CASE-WHENS를 중첩하려면이 구문이 필요한 코드를 크게 줄입니다.
매트 켐프

1
@Leigh이 답변에 감사드립니다. 하나의 스레드에서 다른 형식을 모두 사용하는 것이 좋으며 참조로 더 유용하게 사용할 수 있습니다.
Jason Wheeler

3
@Bigwheels-와우 .. 이것은 얼마 전이었다. 논리적으로 다른 응답 과 정확히 동일하기 때문에 나는 동의하지 않았다 . 즉, 당신과 매트는 올바른 지적을합니다. 질문이 "OR 사용하는 올바른 구문은 무엇입니까?"인 경우에는 답변 이 제공됩니다. 그러나 "필요한 구문 감소"가 목표 인 경우 허용되는 응답 이 더 간결합니다. BTW, 대런의 대답에 대한 슬램이 아니며 완벽하게 유효합니다. 그냥 내 $ 0.02 :)
Leigh

2
IN키워드를 사용하는 것이 훨씬 더 나은 방법입니다
Sagar Naliyapara

57
CASE WHEN ebv.db_no  IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

53

WHEN에있는 표현식 중 하나를 사용할 수 있지만 둘을 혼합 할 수는 없습니다.

  1. 언제 when_expression

    단순 CASE 형식이 사용될 때 input_expression이 비교되는 단순 표현식입니다. when_expression은 유효한 표현식입니다. input_expression 및 각 when_expression의 데이터 유형은 동일하거나 내재적 변환이어야합니다.

  2. Boolean_expression

    검색된 CASE 형식을 사용할 때 부울 표현식이 평가됩니까? Boolean_expression은 유효한 부울 식입니다.

다음을 프로그래밍 할 수 있습니다.

1.

    CASE ProductLine
            WHEN 'R' THEN 'Road'
            WHEN 'M' THEN 'Mountain'
            WHEN 'T' THEN 'Touring'
            WHEN 'S' THEN 'Other sale items'
            ELSE 'Not for sale'

2.

    CASE
            WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
            WHEN ListPrice < 50 THEN 'Under $50'
            WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
            WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
            ELSE 'Over $1000'
          END

그러나 어쨌든 변수 순위가 부울 식으로 비교 될 것으로 기대할 수 있습니다.

CASE (Transact-SQL) (MSDN)를 참조하십시오 .


37

와 관련하여 이미 많은 답변이 CASE있습니다. 언제 어떻게 사용하는지 설명하겠습니다 CASE.

SQL 쿼리의 어느 곳에서나 CASE 표현식을 사용할 수 있습니다. CASE 표현식은 SELECT 문, WHERE 절, Order by 절, HAVING 절, ​​Insert, UPDATE 및 DELETE 문에서 사용할 수 있습니다.

CASE 표현식에는 다음 두 가지 형식이 있습니다.

  1. 간단한 CASE 표현

    CASE expression
    WHEN expression1 THEN Result1
    WHEN expression2 THEN Result2
    ELSE ResultN
    END

    결과를 찾기 위해 표현식을 간단한 표현식 세트와 비교합니다. 이 표현식은 표현식을 동등성에 대해 각 WHEN 절의 표현식과 비교합니다. WHEN 절 내의 표현식이 일치하면 THEN 절의 표현식이 리턴됩니다.

    이것은 OP의 질문이 떨어지는 곳입니다. 22978 OR 23218 OR 23219ebv.db_no 표현식과 같은 값을 얻지 못합니다. 그것이 오류를 일으키는 이유입니다. input_expression 및 각 when_expression의 데이터 유형은 동일하거나 내재적 변환이어야합니다.

  2. 검색 CASE 표현식

    CASE
    WHEN Boolean_expression1 THEN Result1
    WHEN Boolean_expression2 THEN Result2
    ELSE ResultN
    END

    이 표현식은 부울 표현식 세트를 평가하여 결과를 찾습니다. 이 표현식을 사용하면 각 부울 표현식에서 비교 연산자 및 논리 연산자 AND / OR을 사용할 수 있습니다.

CASE 식으로 1.SELECT 문

--Simple CASE expression: 
SELECT FirstName, State=(CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

-- Searched CASE expression:
SELECT FirstName,State=(CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

CASE 표현식이있는 2.Update 문

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

3. CASE 표현식이있는 ORDER BY 절

-- Simple CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE Gender WHEN 'M' THEN FirstName END Desc,
 CASE Gender WHEN 'F' THEN LastName END ASC

-- Searched CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE WHEN Gender='M' THEN FirstName END Desc,
 CASE WHEN Gender='F' THEN LastName END ASC

CASE 표현을 가진 4.Having 절

-- Simple CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE Gender WHEN 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE Gender WHEN 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

-- Searched CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE WHEN Gender = 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE WHEN Gender = 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

이 사용 사례가 미래에 누군가를 도울 수 있기를 바랍니다.

출처


34

시험

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END

28
SELECT
  Store_Name,
  CASE Store_Name
    WHEN 'Los Angeles' THEN Sales * 2
    WHEN 'San Diego' THEN Sales * 1.5
    ELSE Sales
    END AS "New Sales",
  Txn_Date
FROM Store_Information;

1
사례가 포함 ELSE Sales되지 않은 경우 비즈니스 쿼리에 적합한 기본값을 반환 하는 필드 포함으로 인해 투표 .
FoxDeploy 17시 09 분

3
select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender 
from contacts

1
여기서 무엇을하고 있는지 설명하지 않습니까? 몇 가지 초보자가 이해하기 위해 그 필요 하듯이 설명과 함께 완전한 해답을 제공하는 것이 중요하다 방법이 해결할 수있는 문제 문제
게르하르트 버나드

3
UPDATE table_name 
  SET column_name=CASE 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
END

table_name = 작업을 수행하려는 테이블의 이름입니다.

column_name = 값을 설정하려는 열 / 필드의 이름입니다.

update_value = 설정하려는 값 column_name


11
이 코드는 OP의 문제를 해결할 수 있지만, 몇 마디의 설명은 미래 독자에게 더 도움이 될 것입니다.
Thom

-5
Select s.stock_code,s.stock_desc,s.stock_desc_ar,
mc.category_name,s.sel_price,
case when s.allow_discount=0 then 'Non Promotional Item' else 'Prmotional 
item' end 'Promotion'
From tbl_stock s inner join tbl_stock_category c on s.stock_id=c.stock_id
inner join tbl_category mc on c.category_id=mc.category_id
where mc.category_id=2 and s.isSerialBased=0 

1
이 답변은 질문과 관련이없는 것처럼 보입니다.
LarsTech

4
베어 코드를 게시하지 말고 코드의 기능에 대한 설명도 제공하십시오.
Jonathan Mee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.