[SQL] SQL Server 2008의 "WHERE"절에서 "CASE"문
SQLSQL Server 2008의 "WHERE"절에서 "CASE"문
나는 "WHERE"절에서 "CASE"문이 포함 된 쿼리와 함께 일하고 있습니다. 그것을 실행하는 동안 그러나 SQL 서버 2008 약간의 오차주고있다. 사람이 올바른 쿼리 도움이 저를 기쁘게 할 수 있습니까? 다음 쿼리는 다음과 같습니다
SELECT
tl.storenum 'Store #',
co.ccnum 'FuelFirst Card #',
co.dtentered 'Date Entered',
CASE st.reasonid
WHEN 1 THEN 'Active'
WHEN 2 THEN 'Not Active'
WHEN 0 THEN st.ccstatustypename
ELSE 'Unknown'
END 'Status',
CASE st.ccstatustypename
WHEN 'Active' THEN ' '
WHEN 'Not Active' THEN ' '
ELSE st.ccstatustypename
END 'Reason',
UPPER(REPLACE(REPLACE(co.personentered,'RT\\\\',''),'RACETRAC\\\\','')) 'Person Entered',
co.comments 'Comments or Notes'
FROM
comments co
INNER JOIN cards cc ON co.ccnum=cc.ccnum
INNER JOIN customerinfo ci ON cc.customerinfoid=ci.customerinfoid
INNER JOIN ccstatustype st ON st.ccstatustypeid=cc.ccstatustypeid
INNER JOIN customerstatus cs ON cs.customerstatuscd=ci.customerstatuscd
INNER JOIN transactionlog tl ON tl.transactionlogid=co.transactionlogid
LEFT JOIN stores s ON s.StoreNum = tl.StoreNum
WHERE
CASE LEN('TestPerson')
WHEN 0 THEN co.personentered = co.personentered
ELSE co.personentered LIKE '%TestPerson'
END
AND cc.ccnum = CASE LEN('TestFFNum')
WHEN 0 THEN cc.ccnum
ELSE 'TestFFNum'
END
AND CASE LEN('2011-01-09 11:56:29.327')
WHEN 0 THEN co.DTEntered = co.DTEntered
ELSE
CASE LEN('2012-01-09 11:56:29.327')
WHEN 0 THEN co.DTEntered >= '2011-01-09 11:56:29.327'
ELSE co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327'
END
END
AND tl.storenum < 699
ORDER BY tl.StoreNum
해결법
-
==============================
1.첫째, 경우 문은 표현이 아닌 표현 자체의 일부 여야합니다.
첫째, 경우 문은 표현이 아닌 표현 자체의 일부 여야합니다.
즉, 당신은 할 수 있습니다 :
WHERE co.DTEntered = CASE WHEN LEN('blah') = 0 THEN co.DTEntered ELSE '2011-01-01' END
그러나 당신이 그 (것) 등을 쓴 방식으로 작동하지 않습니다
WHERE CASE LEN('TestPerson') WHEN 0 THEN co.personentered = co.personentered ELSE co.personentered LIKE '%TestPerson' END
이 같은 결합 OR 문을 사용하여 더 좋은 행운이있을 수 있습니다 :
WHERE ( (LEN('TestPerson') = 0 AND co.personentered = co.personentered ) OR (LEN('TestPerson') <> 0 AND co.personentered LIKE '%TestPerson') )
,하지만 난 당신이 얻을 것이다 어떻게 쿼리 계획의 큰 아니에요 어느 쪽이든. 절은 자주 인덱스를 사용하면 쿼리 최적화 프로그램에서 방지하는의 헛소리 이러한 유형의.
-
==============================
2.이는 당분간 문제를 해결해야하지만 난 그게 좋은 접근하지 않습니다 당신을 생각 나게한다 :
이는 당분간 문제를 해결해야하지만 난 그게 좋은 접근하지 않습니다 당신을 생각 나게한다 :
WHERE CASE LEN('TestPerson') WHEN 0 THEN CASE WHEN co.personentered = co.personentered THEN 1 ELSE 0 END ELSE CASE WHEN co.personentered LIKE '%TestPerson' THEN 1 ELSE 0 END END = 1 AND cc.ccnum = CASE LEN('TestFFNum') WHEN 0 THEN cc.ccnum ELSE 'TestFFNum' END AND CASE LEN('2011-01-09 11:56:29.327') WHEN 0 THEN CASE WHEN co.DTEntered = co.DTEntered THEN 1 ELSE 0 END ELSE CASE LEN('2012-01-09 11:56:29.327') WHEN 0 THEN CASE WHEN co.DTEntered >= '2011-01-09 11:56:29.327' THEN 1 ELSE 0 END ELSE CASE WHEN co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327' THEN 1 ELSE 0 END END END = 1 AND tl.storenum < 699
-
==============================
3.다음을 시도해보십시오
다음을 시도해보십시오
select * From emp_master where emp_last_name= case emp_first_name when 'test' then 'test' when 'Mr name' then 'name' end
-
==============================
4.나는 당신의 쿼리의 시작이 그 같이해야한다고 생각 :
나는 당신의 쿼리의 시작이 그 같이해야한다고 생각 :
SELECT tl.storenum [Store #], co.ccnum [FuelFirst Card #], co.dtentered [Date Entered], CASE st.reasonid WHEN 1 THEN 'Active' WHEN 2 THEN 'Not Active' WHEN 0 THEN st.ccstatustypename ELSE 'Unknown' END [Status], CASE st.ccstatustypename WHEN 'Active' THEN ' ' WHEN 'Not Active' THEN ' ' ELSE st.ccstatustypename END [Reason], UPPER(REPLACE(REPLACE(co.personentered,'RT\\\\',''),'RACETRAC\\\\','')) [Person Entered], co.comments [Comments or Notes] FROM comments co INNER JOIN cards cc ON co.ccnum=cc.ccnum INNER JOIN customerinfo ci ON cc.customerinfoid=ci.customerinfoid INNER JOIN ccstatustype st ON st.ccstatustypeid=cc.ccstatustypeid INNER JOIN customerstatus cs ON cs.customerstatuscd=ci.customerstatuscd INNER JOIN transactionlog tl ON tl.transactionlogid=co.transactionlogid LEFT JOIN stores s ON s.StoreNum = tl.StoreNum WHERE CASE WHEN (LEN([TestPerson]) = 0 AND co.personentered = co.personentered) OR (LEN([TestPerson]) <> 0 AND co.personentered LIKE '%'+TestPerson) THEN 1 ELSE 0 END = 1 AND
그러나
무엇 꼬리에 완전히 이해할 수없는
-
==============================
5.이 WHERE 부분은 다음과 같이 작성할 수 있습니다 :
이 WHERE 부분은 다음과 같이 작성할 수 있습니다 :
WHERE (LEN('TestPerson') <> 0 OR co.personentered = co.personentered) AND (LEN('TestPerson') = 0 OR co.personentered LIKE '%TestPerson') AND (cc.ccnum = CASE LEN('TestFFNum') WHEN 0 THEN cc.ccnum ELSE 'TestFFNum' END ) AND (LEN('2011-01-09 11:56:29.327') <> 0 OR co.DTEntered = co.DTEntered ) AND ((LEN('2011-01-09 11:56:29.327') = 0 AND LEN('2012-01-09 11:56:29.327') <> 0) OR co.DTEntered >= '2011-01-09 11:56:29.327' ) AND ((LEN('2011-01-09 11:56:29.327') = 0 AND LEN('2012-01-09 11:56:29.327') = 0) OR co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327' ) AND tl.storenum < 699
-
==============================
6.또한 예를 들어 아래와 같이 시도 할 수 있습니다. 아웃 바운드 선적을 보여
또한 예를 들어 아래와 같이 시도 할 수 있습니다. 아웃 바운드 선적을 보여
SELECT shp_awb_no,shpr_ctry_cd, recvr_ctry_cd, CASE WHEN shpr_ctry_cd = record_ctry_cd THEN "O" ELSE "I" END AS route FROM shipment_details WHERE record_ctry_cd = "JP" AND "O" = CASE WHEN shpr_ctry_cd = record_ctry_cd THEN "O" ELSE "I" END
-
==============================
7.이 질문에 대한 감사합니다, 사실 나는 쿼리 아래에 다른 뭔가를 찾고 있어요. 이 5 월은 사람을 도움이됩니다.
이 질문에 대한 감사합니다, 사실 나는 쿼리 아래에 다른 뭔가를 찾고 있어요. 이 5 월은 사람을 도움이됩니다.
SELECT DISTINCT CASE WHEN OPPORTUNITY='' THEN '(BLANK)' ELSE OPPORTUNITY END AS OPP,LEN(OPPORTUNITY) FROM [DBO].[TBL]
상기 질의는 "(공)"로 드롭에있는 빈 값 프로그램을 작성한다. 우리가 절을 다른 값으로 빈 값을 얻기 위해 SQL로이 값을 전달하는 경우 또한, 나는 그것을 처리하는 방법을 모르겠어요. 그리고 마지막으로이 5 월이 누군가에게 도움이 솔루션 아래에 함께했다.
여기있어 ,
DECLARE @OPP TABLE (OPP VARCHAR(100)) INSERT INTO @OPP VALUES('(BLANK)'),('UNFUNDED'),('FUNDED/NOT COMMITTED') SELECT DISTINCT [OPPORTUNITY] FROM [DBO].[TBL] WHERE ( CASE WHEN OPPORTUNITY ='' THEN '(BLANK)' ELSE OPPORTUNITY END IN (SELECT OPP FROM @OPP)) ORDER BY 1
-
==============================
8.여기 내 솔루션입니다
여기 내 솔루션입니다
AND CLI.PE_NOM Like '%' + ISNULL(@NomClient, CLI.PE_NOM) + '%'
Regads 데비
-
==============================
9.이 작품
이 작품
declare @v int=A select * from Table_Name where XYZ=202 and dbkey=(case @v when A then 'Some Value 1' else 'Some Value 2' end)
-
==============================
10.
select TUM1.userid,TUM1.first_name + ' ' +TUM1.last_name as NAME,tum1.Business_Title,TUM1.manager_id,tum2.First_Name + ' ' + tum2.Last_Name as [MANAGER NAME],TUM1.project,TUM1.project_code,TUM1.rcc_code,TUM1.department,TCM.Company_Name, case when tum1.Gender_ID=1 then 'male' else 'female' end 'GENDER' ,tum1.Band as BAND, case when tum1.Inactive=0 then 'STILL IN COMPANY' else 'LEFT COMPANY' end 'ACTIVE/INACTIVE' from tbl_user_master TUM1 join tbl_Company_Master TCM on TCM.Company_Code=TUM1.Company_Code join tbl_User_Master TUM2 on TUM1.Manager_ID=TUM2.UserID where tum1.UserID in ('54545414')
-
==============================
11.
SELECT * from TABLE WHERE 1 = CASE when TABLE.col = 100 then 1 when TABLE.col = 200 then 2 else 3 END and TABLE.col2 = 'myname';
이런 식으로 사용합니다.
from https://stackoverflow.com/questions/8785209/case-statement-within-where-clause-in-sql-server-2008 by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 체크 대소 문자 구분? (0) | 2020.03.30 |
---|---|
[SQL] SQL에 의해 고유의 레코드를 선택하는 방법 (0) | 2020.03.30 |
[SQL] 어떻게 GROUP BY 작동합니까? (0) | 2020.03.30 |
[SQL] 내부의 성능은 가입 교차 비교 조인 (0) | 2020.03.30 |
[SQL] 그것은 주요 SQL 데이터베이스의 테이블 및 ALTER 표 문을 CREATE 롤백 할 수 있습니까? (0) | 2020.03.30 |