[SQL] SQL 스위치 / 케이스에 '어디서'절
SQLSQL 스위치 / 케이스에 '어디서'절
나는 주변 검색을 시도,하지만 난 나를 도움이 될 아무것도 찾을 수 없습니다.
나는 SQL에서이 작업을 수행하기 위해 노력하고있어 :
declare @locationType varchar(50);
declare @locationID int;
SELECT column1, column2
FROM viewWhatever
WHERE
CASE @locationType
WHEN 'location' THEN account_location = @locationID
WHEN 'area' THEN xxx_location_area = @locationID
WHEN 'division' THEN xxx_location_division = @locationID
나는 각각의 끝에 '= @locationID'을 넣어 필요가 없습니다 것을 알고 있지만 나는 올바른 것에 근처에도 구문을 얻을 수 없습니다. SQL은 언제 라인 처음 내 '='에 대해 불평 계속 ...
이걸 어떻게 할 수 있습니까?
해결법
-
==============================
1.
declare @locationType varchar(50); declare @locationID int; SELECT column1, column2 FROM viewWhatever WHERE @locationID = CASE @locationType WHEN 'location' THEN account_location WHEN 'area' THEN xxx_location_area WHEN 'division' THEN xxx_location_division END
-
==============================
2.case 문이없는 ...
case 문이없는 ...
SELECT column1, column2 FROM viewWhatever WHERE (@locationType = 'location' AND account_location = @locationID) OR (@locationType = 'area' AND xxx_location_area = @locationID) OR (@locationType = 'division' AND xxx_location_division = @locationID)
-
==============================
3.여기 당신은 간다.
여기 당신은 간다.
SELECT column1, column2 FROM viewWhatever WHERE CASE WHEN @locationType = 'location' AND account_location = @locationID THEN 1 WHEN @locationType = 'area' AND xxx_location_area = @locationID THEN 1 WHEN @locationType = 'division' AND xxx_location_division = @locationID THEN 1 ELSE 0 END = 1
-
==============================
4.나는이 결함이 테이블 구조의 지표이다라고 말하고 싶지만. 아마도 다른 위치의 유형은 훨씬 풍부한 질의를하고 또한 주변에 불필요한 열을 피하기 위해 수 있도록, 다른 테이블에서 분리되어야한다.
나는이 결함이 테이블 구조의 지표이다라고 말하고 싶지만. 아마도 다른 위치의 유형은 훨씬 풍부한 질의를하고 또한 주변에 불필요한 열을 피하기 위해 수 있도록, 다른 테이블에서 분리되어야한다.
당신은 힘의 작업 아래처럼 뭔가를 구조를 변경할 수없는 경우 :
SELECT * FROM Test WHERE Account_Location = ( CASE LocationType WHEN 'location' THEN @locationID ELSE Account_Location END ) AND Account_Location_Area = ( CASE LocationType WHEN 'area' THEN @locationID ELSE Account_Location_Area END )
그리고 등등 ... 우리는 즉시 쿼리의 구조를 변경할 수는 없지만 우리는 술어가 자신을 동일하게하여 재정의 할 수 있습니다.
편집 : 위의 제안은 물론 훨씬 더의 있습니다, 단지 내를 무시합니다.
-
==============================
5.이것에 대한 문제는 SQL 엔진 표현식을 평가로 진행하면,이 부분으로부터 적절한 테이블을 끌어 확인하고 부가 일부 기본 기준을 제공하는 곳, 그래서 제대로 동적 상태를 평가할 수 없다는되는 열에 에 대해 확인.
이것에 대한 문제는 SQL 엔진 표현식을 평가로 진행하면,이 부분으로부터 적절한 테이블을 끌어 확인하고 부가 일부 기본 기준을 제공하는 곳, 그래서 제대로 동적 상태를 평가할 수 없다는되는 열에 에 대해 확인.
당신은 당신이 같은 술어에서 WHERE 조건을 체크 할 때 WHERE 절을 사용할 수 있습니다
WHERE account_location = CASE @locationType WHEN 'business' THEN 45 WHEN 'area' THEN 52 END
그래서 당신의 특별한 경우에, 당신이 필요 해요 저장 프로 시저로 쿼리를 넣어 또는 세 개의 쿼리를 만들 수 있습니다.
-
==============================
6.OR 연산자 언제 어디 상태 케이스의 대안이 될 수있다
OR 연산자 언제 어디 상태 케이스의 대안이 될 수있다
ALTER PROCEDURE [dbo].[RPT_340bClinicDrugInventorySummary] -- Add the parameters for the stored procedure here @ClinicId BIGINT = 0, @selecttype int, @selectedValue varchar (50) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; SELECT drugstock_drugname.n_cur_bal,drugname.cdrugname,clinic.cclinicname FROM drugstock_drugname INNER JOIN drugname ON drugstock_drugname.drugnameid_FK = drugname.drugnameid_PK INNER JOIN drugstock_drugndc ON drugname.drugnameid_PK = drugstock_drugndc.drugnameid_FK INNER JOIN drugndc ON drugstock_drugndc.drugndcid_FK = drugndc.drugid_PK LEFT JOIN clinic ON drugstock_drugname.clinicid_FK = clinic.clinicid_PK WHERE (@ClinicId = 0 AND 1 = 1) OR (@ClinicId != 0 AND drugstock_drugname.clinicid_FK = @ClinicId) -- Alternative Case When You can use OR AND ((@selecttype = 1 AND 1 = 1) OR (@selecttype = 2 AND drugname.drugnameid_PK = @selectedValue) OR (@selecttype = 3 AND drugndc.drugid_PK = @selectedValue) OR (@selecttype = 4 AND drugname.cdrugclass = 'C2') OR (@selecttype = 5 AND LEFT(drugname.cdrugclass, 1) = 'C')) ORDER BY clinic.cclinicname, drugname.cdrugname END
-
==============================
7.이 쿼리를 시도하십시오. 위 게시물에 대한 답변 :
이 쿼리를 시도하십시오. 위 게시물에 대한 답변 :
select @msgID, account_id from viewMailAccountsHeirachy where CASE @smartLocationType WHEN 'store' THEN account_location WHEN 'area' THEN xxx_location_area WHEN 'division' THEN xxx_location_division WHEN 'company' THEN xxx_location_company END = @smartLocation
-
==============================
8.이 시도:
이 시도:
WHERE ( @smartLocationType IS NULL OR account_location = ( CASE WHEN @smartLocationType IS NOT NULL THEN @smartLocationType ELSE account_location END ) )
-
==============================
9.
Case Statement in SQL Server Example Syntax CASE [ expression ] WHEN condition_1 THEN result_1 WHEN condition_2 THEN result_2 ... WHEN condition_n THEN result_n ELSE result END Example SELECT contact_id, CASE website_id WHEN 1 THEN 'TechOnTheNet.com' WHEN 2 THEN 'CheckYourMath.com' ELSE 'BigActivities.com' END FROM contacts; OR SELECT contact_id, CASE WHEN website_id = 1 THEN 'TechOnTheNet.com' WHEN website_id = 2 THEN 'CheckYourMath.com' ELSE 'BigActivities.com' END FROM contacts;
-
==============================
10.이 쿼리를 시도하십시오. 그것의 아주 쉽게 이해하기 :
이 쿼리를 시도하십시오. 그것의 아주 쉽게 이해하기 :
CREATE TABLE PersonsDetail(FirstName nvarchar(20), LastName nvarchar(20), GenderID int); GO INSERT INTO PersonsDetail VALUES(N'Gourav', N'Bhatia', 2), (N'Ramesh', N'Kumar', 1), (N'Ram', N'Lal', 2), (N'Sunil', N'Kumar', 3), (N'Sunny', N'Sehgal', 1), (N'Malkeet', N'Shaoul', 3), (N'Jassy', N'Sohal', 2); GO SELECT FirstName, LastName, Gender = CASE GenderID WHEN 1 THEN 'Male' WHEN 2 THEN 'Female' ELSE 'Unknown' END FROM PersonsDetail
from https://stackoverflow.com/questions/206484/sql-switch-case-in-where-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 수와 같은 SQL 위해 문자열 (0) | 2020.03.31 |
---|---|
[SQL] X SELECT * FROM WHERE 단정 한 ORM과 아이디 IN (...) (0) | 2020.03.31 |
[SQL] SQL 쿼리 기존 테이블에 대한 스크립트를 생성 생성 (0) | 2020.03.31 |
[SQL] SQLite는 데이터베이스에서 중복 행을 삭제 (0) | 2020.03.31 |
[SQL] DB를 모든 테이블, 행과 열에서 문자열 검색 (0) | 2020.03.31 |