2017-12-21 6 views
0

나는 다음과 같은 문장이 있습니다 필드 지역에서 올바른 상태로 나에게 테이블을 업데이트SQL 서버

Select No, Region = 'Ohio' 
FROM table 
where PostCode >='0001' 
AND PostCode <= '4999' 

합니다. 같은 성명에서 여러 다른 WHERE 조건을 사용하여 해당 성명을 어떻게 확장 할 수 있습니까?

Region = 'NewYork' 
Where PostCode >='5000' 
AND PostCode <= '7999' 

내 솔루션은 각 지역마다 몇 가지 구문을 작성하는 것이지만 더 좋은 방법이 있어야합니다.

+0

당신이 무엇을 원하는지 불분명하다. 우편 번호 범위를 이름에 연결해야한다면 [from, to, regionName]으로 테이블을 만들고 그것을 'b.from과 b.to 사이의 a.postcode'로 조인 할 수있다. –

답변

1

일반적인 두 가지 방법이 case 진술하고 그 값을 다른 테이블에 join을하고 있습니다. 또한이 점에 대해 SQL 서버에서 between 연산자를 이용할 수 있다는 점을 지적해야합니다. 당신이 기준의 작은 집합이있는 경우, 또는 그냥 함께 애드혹 쿼리를 던져해야하는 경우 단일 쿼리
에서


CASE 문은 case 문 유용 할 수 있습니다. -이 데이터가 특히 이후

select 
    No, 
    Region = case 
     when (PostCode >= '0001' and PostCode <= '4999') 
      'Ohio' 
     when (PostCode between '5000' and '7999') 
      'NewYork' 
     else 
      'Unknown' 
     end 
from [...] 

이 확실히 (50 개)의 상태를 평가처럼 뭔가 더 나은 방법 인 가치와 기준
있는 테이블을 조인 다음 case 문을 사용하는 예입니다 정적 일 가능성이 높습니다. 아이디어는 조건과 값을 포함하는 테이블을 가지고 테이블에 결합하고자하는 것입니다.

다음은 임시 테이블을 사용하는 예입니다. 실제 테이블을 상태처럼 일반적인 것으로 사용하고자 할 것입니다.

-- Setup a #states table 
create table #states (state varchar(20), PostCodeMin char(4), PostCodeMax char(4)) 
insert into #states values ('Ohio', '0001', '4999') 
insert into #states values ('NewYork', '5000', '7999') 

-- Now query it 
select 
    t.No, 
    State = isnull(s.state, 'Unknown') 
from 
    my_table t 
    left outer join #states s 
     on (t.PostCode between s.PostCodeMin and s.PostCodeMax) 

위의 쿼리에서 상태가 설정되지 않은 경우를 대비하여 #states에 왼쪽 외부 조인을 수행합니다. 또한 외부 조인이 my_table의 특정 행에 대해 아무 것도 반환하지 않는 경우를 대비하여 isnull을 사용하여 State를 선택합니다.

+1

두 번째 JOIN 문은 내가 찾고있는 것이고 잘 작동하는 것입니다. 고마워요! –

0

지역에 case 문을 사용하여 계산 된 필드를 만들 수 있습니다. 많은 "Unknown"레코드가 반환 될 경우 더 나은 성능을 위해 불필요한 레코드를 필터링하기 위해 WHERE 절을 조정할 수 있습니다./단일 쿼리에서 여러 기준에 따라 설정 다른 값을 선택

SELECT 
    * 
FROM 
(
    Select 
     No, 
     Region = 
      CASE 
       WHEN PostCode >'0001' AND PostCode <='4999' THEN 'Ohio' 
       WHEN PostCode >'5000' AND PostCode <='7999' THEN 'New York' 
      ELSE 
       'Unknown' 
      END 
    FROM table 
    where PostCode >='0001' AND PostCode <= '7999' 
)AS X 
ORDER BY 
    Region 
+0

파생 테이블이 필요한 이유는 무엇입니까? – RToyo

+1

파생 필드로 주문하려는 경우가 아니면 필요하지 않습니다. –