SQL 스위치/'where' 절의 대/소문자 구분
주변을 찾아봤지만 도움이 될 만한 것을 찾을 수 없었습니다.
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
= @location을 입력할 필요가 없다는 것을 알고 있습니다.각각의 끝에 'ID'가 있는데 구문이 거의 정확하지도 않습니다.SQL에서 첫 번째 WHEN 줄에 있는 '='에 대해 계속 불만을 표시합니다.
어떻게 해야 하나요?
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
사건 진술 없이는...
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)
여기 있어요.
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
저는 이것이 결함이 있는 테이블 구조의 지표라고 말하고 싶습니다.서로 다른 위치 유형을 다른 테이블로 구분하여 훨씬 풍부한 쿼리를 수행하고 불필요한 열이 주변에 있는 것을 방지해야 합니다.
구조를 변경할 수 없는 경우 다음과 같은 작업이 수행될 수 있습니다.
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
)
그래서...쿼리의 구조를 즉시 변경할 수는 없지만 술어를 동일하게 만들어 재정의할 수는 있습니다.
편집: 위의 제안들은 물론 훨씬 더 낫습니다. 제 제안은 무시하세요.
문제는 SQL 엔진이 식을 평가하기 위해 FROM 부분을 확인하여 적절한 테이블을 가져온 다음 WHERE 부분에서 일부 기본 조건을 제공하므로 확인할 열에 대한 동적 조건을 제대로 평가할 수 없다는 것입니다.
다음과 같은 서술어의 WHERE 기준을 확인할 때 WHERE 절을 사용할 수 있습니다.
WHERE account_location = CASE @locationType
WHEN 'business' THEN 45
WHEN 'area' THEN 52
END
따라서 특정한 경우에는 쿼리를 저장 프로시저에 넣거나 세 개의 별도 쿼리를 만들어야 합니다.
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
이 쿼리를 사용해 보십시오.위 게시물에 대한 답변:
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
사용해 보십시오.
WHERE (
@smartLocationType IS NULL
OR account_location = (
CASE
WHEN @smartLocationType IS NOT NULL
THEN @smartLocationType
ELSE account_location
END
)
)
CREATE PROCEDURE [dbo].[Temp_Proc_Select_City]
@StateId INT
AS
BEGIN
SELECT * FROM tbl_City
WHERE
@StateID = CASE WHEN ISNULL(@StateId,0) = 0 THEN 0 ELSE StateId END ORDER BY CityName
END
이 쿼리를 사용해 보십시오. 매우 쉽고 유용합니다.실행할 준비가 되었습니다!
USE tempdb
GO
IF NOT OBJECT_ID('Tempdb..Contacts') IS NULL
DROP TABLE Contacts
CREATE TABLE Contacts(ID INT, FirstName VARCHAR(100), LastName VARCHAR(100))
INSERT INTO Contacts (ID, FirstName, LastName)
SELECT 1, 'Omid', 'Karami'
UNION ALL
SELECT 2, 'Alen', 'Fars'
UNION ALL
SELECT 3, 'Sharon', 'b'
UNION ALL
SELECT 4, 'Poja', 'Kar'
UNION ALL
SELECT 5, 'Ryan', 'Lasr'
GO
DECLARE @FirstName VARCHAR(100)
SET @FirstName = 'Omid'
DECLARE @LastName VARCHAR(100)
SET @LastName = ''
SELECT FirstName, LastName
FROM Contacts
WHERE
FirstName = CASE
WHEN LEN(@FirstName) > 0 THEN @FirstName
ELSE FirstName
END
AND
LastName = CASE
WHEN LEN(@LastName) > 0 THEN @LastName
ELSE LastName
END
GO
일반적으로 이러한 방식으로 조건이 다른 경우를 관리할 수 있습니다.
SELECT *
FROM viewWhatever
WHERE 1=(CASE <case column or variable>
WHEN '<value1>' THEN IIF(<where condition 1>,1,0)
WHEN '<value2>' THEN IIF(<where condition 2>,1,0)
ELSE IIF(<else condition>,1,0)
END)
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;
이것은 저에게 효과가 있었습니다.
CREATE TABLE PER_CAL ( CAL_YEAR INT, CAL_PER INT ) INSERT INTO PER_CAL( CAL_YEAR, CAL_PER ) VALUES ( 20,1 ), ( 20,2 ), ( 20,3 ), ( 20,4 ), ( 20,5 ), ( 20,6 ), ( 20,7 ), ( 20,8 ), ( 20,9 ), ( 20,10 ), ( 20,11 ), ( 20,12 ), ( 99,1 ), ( 99,2 ), ( 99,3 ), ( 99,4 ), ( 99,5 ), ( 99,6 ), ( 99,7 ), ( 99,8 ), ( 99,9 ), ( 99,10 ), ( 99,11 ), ( 99,12 )
4자리 세기는 규칙에 의해 결정됩니다. 해가 50 이상이면 세기는 1900이고 그렇지 않으면 2000입니다.
분기와 같이 시작 및 종료 기간을 표시하는 두 개의 6자리 마침표를 지정하면 해당 범위에 해당하는 행을 반환합니다.
-- 1st quarter of 2020 SELECT * FROM PER_CAL WHERE (( CASE WHEN CAL_YEAR > 50 THEN 1900 ELSE 2000 END + CAL_YEAR ) * 100 + CAL_PER ) BETWEEN 202001 AND 202003 -- 4th quarter of 1999 SELECT * FROM PER_CAL WHERE (( CASE WHEN CAL_YEAR > 50 THEN 1900 ELSE 2000 END + CAL_YEAR ) * 100 + CAL_PER ) BETWEEN 199910 AND 199912
이 쿼리를 사용해 보십시오.매우 쉽게 이해할 수 있습니다.
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
언급URL : https://stackoverflow.com/questions/206484/sql-switch-case-in-where-clause
'sourcetip' 카테고리의 다른 글
이벤트 트리 이벤트경변 이벤트 트리 이벤트경변 이벤트 트리 이벤트경변 (0) | 2023.08.01 |
---|---|
Python에서 개체 목록 검색 (0) | 2023.07.27 |
PowerShell에서 새 줄로 배열 결합 (0) | 2023.07.27 |
NSMutable 어레이 인덱스 간에 개체 이동 (0) | 2023.07.27 |
자바스크립트로 iframe의 본문 내용을 얻는 방법은? (0) | 2023.07.27 |