2012-02-17 4 views
1

주소를 선택하는 저장 프로 시저를 쓰고 있습니다. 많은 선택 매개 변수가 있지만 나에게 문제가되는 원인은 상태를 선택하는 것입니다. 국가는 필수이며 하나 이상의 국가 이름을 가질 수 있습니다. 국가가 USA 인 경우 상태는 NULL 또는 일대 다 많은 상태 코드가 될 수 있습니다. 나는 테이블 반환 함수 (ParmTable_String)가 그래서 매개 변수 목록에 가입 할 수 있으며이 상태 코드가있을 때 작동합니다SQL 조인 매개 변수 목록 또는 null

DECLARE @Country AS varchar(MAX); 
DECLARE @State AS varchar(256); 
SET @Country = 'USA'; 
SET @State = 'ME, VT'; 
SELECT * 
FROM Customer 
JOIN ParmTable_String(@Country, ',') AS CT 
ON Country = CT.str 
JOIN ParmTable_String(@State, ',') AS ST 
ON State = ST.str 

하지만 @State = null 만약 내가 널 결과 집합을 얻을. 내가 왼쪽 조인을 만들고 where 절을 추가하면 단일 상태 코드 나 null에서는 작동하지만 목록에서는 작동하지 않습니다.

WHERE State = @State OR @State IS NULL 

누구나 해결책이 있습니까?

확인을 나는 해결책을 가지고 있지만 나는 이것이 나에게 조금 원유 보인다 더 나은 방법이 있다고 생각 해요 :

DECLARE @Country AS varchar(MAX); 
DECLARE @State AS varchar(256); 
SET @Country = 'USA'; 
SET @State = 'ME, VT'; 
SELECT * 
FROM Customer 
JOIN ParmTable_String(@Country, ',') AS CT 
ON Country = CT.str 
WHERE (State IN 
(SELECT str from lntw.ParmTable_String(@State, ',')) OR @State IS NULL) 
+0

ansi_nulls를 해제 했습니까? –

+0

예 및 테이블 반환 함수에서 반환 된 문자열에 NULLIF를 시도했지만 결과가 없습니다. – GBrookman

+0

ParmTable_String에 대한 코드와 예상 결과의 예를 게시 하시겠습니까? 나는 좋은 해결책을 가지고 있다고 생각하지만, 알기가 어렵다. –

답변

0

를 내가 SQL 서버에 익숙하지 아니라고하지만 궁금하면이 같은 ** 내가 NULLIF를 가정하고

State = NULLIF(@State,State) 

를 작동 할 수 있습니다 것은 ST.str이 빈 문자열 인 경우 null를 돌려줍니다 오라클의 NVL에 해당 뭔가() 함수

+0

고마워하지만 문제는 @State는 'ME, VT, MA, NH, CT'가 될 수 있으므로 복수 값을 처리하지 못합니다. – GBrookman

0

NULLIF (ST.str, '')입니다. 그런 다음 State = NULL로 시도하면 레코드가 반환되지 않습니다.

IF @State is null 
BEGIN 
    SELECT * FROM Customer 
    JOIN ParmTable_String(@Country, ',') AS CT 
    ON Country = CT.str 
END 
ELSE 
BEGIN 
    SELECT * FROM Customer 
    JOIN ParmTable_String(@Country, ',') AS CT 
    ON Country = CT.str 
    JOIN ParmTable_String(@State, ',') AS ST 
    ON State = ST.str 
END 
+0

감사합니다.하지만 왼쪽의 join 옵션에 대한 문제는 where 절이 많은 상태 코드가 될 수 있기 때문입니다 . 아직 시도하지는 않았지만 where 절에서 표식 값 함수의 select를 추가 할 수 있다고 가정합니다. 그러나 나는 더 간단한 것을 놓친 것 같아요. – GBrookman

+0

왼쪽 조인을 사용하여 where 절에있는 여러 상태를 필터링하는 방법은 다음과 같습니다.''ca ','ny ','ak ')의 isnull (state,' ')' –

+0

isnull) 기능. 열을 필터링하고 해당 열이 null 인 행을 유지하려는 경우 도움이됩니다. –

0
당신은이

OR :

일치하는 상태가 있는지 여부는 고객 레코드를 반환해야합니다,이 시도 약

DECLARE @Country AS varchar (MAX);
DECLARE @State AS varchar (256);
SET @Country = '미국';
SET @State = 'ME, VT'; 고객
FROM
SELECT *
는 AS ('ISNULL (@state,') ') CT =
국가 CT.str
LEFT JOIN ParmTable_String ON AS ParmTable_String (@Country을' ') JOIN ST
ON 상태 = ST.str

+0

질문에 대한 언급에서 언급했듯이이 방법은 단순함을 권장합니다. – blntechie

+0

나는 SQL이 그리 좋지 않으므로? :) 실제 쿼리는 꽤 복잡합니다. where 절에는 많은 조건에 대해 12 개의 매개 변수가 있으며 a *보다 select에 더 많은 매개 변수가 있습니다. 내가 IF 경로를 찾으면 @State 로직을 제외하고 모든 것을 다 처리해야합니까? OR이 없으면 더 빠릅니까? 나는 여러 과정을 생각해 보았지만 그 과정은 더 복잡해 보였다. – GBrookman

+0

아무도 12 (계승) 쿼리를 쓰고 싶어하지 않는 것은 사실입니다. 여기에 - 쿼리 실행 * 중에 매개 변수가 평가되는 단일 쿼리를 만들 때 쿼리 최적화 프로그램이 쿼리 계획을 잘 수행 할 수있는 기능이 제거됩니다. 그것은 신 - 질의를위한 단일 계획을 세울 것이며 그 단일 계획은 모든 매개 변수 조합에 적합하지 않을 수 있습니다. 이 두 가지 문제 (너무 많은 쿼리 작성, 단일 쿼리는 단일 계획 가져 오기)를 해결하기 위해 대부분의 사람들은 일종의 동적 SQL/또는 machine'd 쿼리 구성을 사용합니다. 최적화 프로그램에 도달하기 전에 각 쿼리를 작성하십시오. –

0

방법 : 왜 안 대신 두 개의 쿼리 시도 ...

DECLARE @Country AS varchar(MAX); 
DECLARE @State AS varchar(256); 
SET @Country = 'USA'; 
SET @State = 'ME, VT'; 

SELECT * 
FROM Customer 
    JOIN ParmTable_String(@Country, ',') AS CT 
     ON Country = CT.str 
    JOIN ParmTable_String(isnull(@State,''), ',') AS ST 
     ON (State = ST.str or State is null) 
+0

고마워요,하지만 왼쪽 조인에서는 where 절이 필요하거나 상태를 필터링하지 않고 여러 상태의 문제가 발생합니다. – GBrookman

+0

아, 죄송하지만, 필요한 것은 where 절을 수정하는 것입니다. 기본적으로, 당신은 @state가 null이 아닐 때 당신은 오직 일치하는 상태를 원한다고 말합니다, 그러나 그것이 모든 것을 원할 때, 맞습니까? – Mordechai

+0

댓글 인터페이스를 파악하지 못하는 것 같습니다. 어떤 경우 든 where 조건은 다음과 같아야합니다. WHERE ST.str이 NULL이 아니거나 "@state"가 null입니다. 이렇게하면 조건에 맞게 왼쪽/오른쪽 조인을 할 수 있습니다. – Mordechai