[SQL] WHERE 절에서 선택적 인수 [중복]
SQLWHERE 절에서 선택적 인수 [중복]
3 PARAMS가있는 저장 프로 시저가 있다고 가정 할 수 있습니다. 모든 가능성 중, 내가 사용하는 ()와 () 또는 () 너무 많이와 걷잡을 수없이 WHERE 절 하나에 이것을 달성하기 위해 찾고 있어요 ...
예:
//Params
@CITY VARCHAR(100) = NULL,
@GENDER VARCHAR(100) = NULL,
@AGE VARCHAR(100) = NULL
난 당신이 IF 시작 ... 각 변수에 대한 END를있는 경우 사용을 할 수 있다고 생각하지만, 그 코드를 많이 생각보다 길 수 있습니다 ..
그 방법은 너무 오래 (같은 10 개 가지 분야에 대해이 있지만 예제는 3 인) 때문에이 방법은 아래에 작동하지 않으며 심지어 직접 고유 한 값을 끌어 있는지 확실하지 않습니다 ...
SELECT NAME FROM TABLE
WHERE (
(CITY=@CITY AND GENDER=@GENDER AND AGE=@AGE)
OR (CITY=@CITY AND GENDER=@GENDER)
OR (GENDER=@GENDER AND AGE=@AGE)
OR (CITY=@CITY AND AGE=@AGE)
OR (CITY=@CITY)
OR (GENDER=@GENDER)
OR (AGE=@AGE)
)
이 작업을 수행하는 더 짧은 더 효율적인 방법이 있나요?
이 방법은 또한의 가입과 호환 될 수 있도록 그렇다면, 그것은 바람직하다.
해결법
-
==============================
1.대안 ISNULL / COALESCE 옵션에, 당신은 널 (null) 인을위한 매개 변수를 테스트 할 수 있습니다 :
대안 ISNULL / COALESCE 옵션에, 당신은 널 (null) 인을위한 매개 변수를 테스트 할 수 있습니다 :
SELECT NAME FROM TABLE WHERE (@City IS NULL OR City = @City) AND (@Gender IS NULL OR Gender = @Gender) AND (@Age IS NULL OR Age = @Age)
-
==============================
2.무엇에 대해?
무엇에 대해?
SELECT NAME FROM TABLE WHERE CITY = COALESCE(@CITY, CITY) AND GENDER = COALESCE(@GENDER, GENDER) AND AGE = COALESCE(@AGE, AGE)
-
==============================
3.이 같은 시도 :
이 같은 시도 :
SELECT NAME FROM TABLE WHERE City = IsNull(@City, City) AND Gender = IsNull(@Gender, Gender) AND Age = IsNull(@Age, Age)
또는:
SELECT NAME FROM TABLE WHERE (City = @City OR @City IS NULL) AND (Gender = @Gender OR @Gender IS NULL) AND (Age = @Age OR @Age IS NULL)
-
==============================
4.
SELECT NAME FROM TABLE WHERE City = case when isnull(@City ,'') = '' then City else @City end AND Gender = case when isnull(@Gender ,'') = '' then Gender else @Gender end AND Age = case when isnull(@Age ,0) = 0 then Age else @Age end
-
==============================
5.아마이 :
아마이 :
create procedure myProc --Params @CITY VARCHAR(100) = NULL, @GENDER VARCHAR(100) = NULL, @AGE VARCHAR(100) = NULL as SELECT NAME FROM [TABLE] WHERE ISNULL(CITY,'')=ISNULL(@CITY,ISNULL(CITY,'')) AND ISNULL(GENDER,'')=ISNULL(@GENDER,ISNULL(GENDER,'')) AND ISNULL(AGE,'')=ISNULL(@AGE,ISNULL(AGE,'')) go
WHERE 절에 열을 가정 널 비교를 피하기 위해 ISNULL을 사용하여, 널 (NULL)입니다.
from https://stackoverflow.com/questions/10185638/optional-arguments-in-where-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 엔티티 프레임 워크의 기본 키와 같은 문자열 속성을 사용하는 방법 (0) | 2020.07.01 |
---|---|
[SQL] MySQL의에서 일련 번호 삽입 (0) | 2020.07.01 |
[SQL] MySQL의 프로파일 링하는 방법 (0) | 2020.07.01 |
[SQL] 왜 그렇게 느린 SQL 애저에 대한 쿼리를 실행? (0) | 2020.07.01 |
[SQL] 어떻게 SQL 테이블을 '빼기'합니까? (0) | 2020.07.01 |