2009-02-03 3 views
4

아마 당신은 SQL 쿼리 좀 도와 수 있습니다조건부 SELECT

을 내가 보조 테이블의 변환 값 다음과 같은 구조를 가지고 : 나는 그런 결과 세트를 필요

ID PRICE_BRL PRICE_USD 
-- --------- --------- 
1 10  5 
2 12  NULL 
3 NULL  3 
4 14  NULL 
5 NULL  4 
6 NULL  NULL 

을 첫 번째 열에 우선 순위를 지정합니다. NULL의 경우 보조 열에 저장된 전환 값을 곱한 두 번째 열 값을 제공합니다. 의사 코드와 같은 것 :

SELECT 
    id, 
    (
    IF (price_brl != null) 
    price_brl 
    ELSE 
    price_usd * tbl_2.value 
) as final_price 
FROM tbl_1 

조인스를 사용하면 간단 할 것입니다.하지만 알아낼 수는 없습니다.

미리 감사드립니다. 뿐만 아니라

+0

아마도 최고의 디자인이 아닙니다. –

+0

이 질문에 타겟 DB의 태그를 달 수 있습니까? –

+0

글쎄, 내 타겟 DB는 SQL DB이다. 데이터베이스를 추출하고 있기 때문이다. –

답변

9

의사 코드 :

select id, coalesce(price_brl, price_usd * tbl_2.value) 
from tbl_1 
inner join tbl2 
분명히
3
select id, isnull(price_brl, price_usd * tbl_2.value) 
from tbl_1 
    inner join tbl_2 
     on tbl_1.id=tbl_2.id 

, 당신은 가입 조정해야합니다. 그러나 나는 이것이 트릭을 할 것이라고 생각한다.

3

coalesce() 문은 예제에서 수행하려는 작업을 정확하게 수행하고 필드에서 null을 테스트 한 다음 null 인 경우 다른 값을 제공합니다. 그러나 당신은 널 (null)에 대한 검사 이외의 뭔가를하고 싶어 (그리고 그것은뿐만 아니라 널 위해 작동합니다) 당신은 case 문 사용할 수 있는지 : 당신은 SQL 서버, 또는 사용자를 지원하는 다른 시스템을 사용하고있는 가정

SELECT id, CASE WHEN price_brl != NULL THEN price_brl ELSE price_usd * tbl_2.value END as final price... 
0

을 이것은 당신이 당신의 질문에서 나에게 가능성이 보인다 약간의 오버 헤드를 부과하지만 내 선택 TBL1

에서

SELECT udf_getPrice (ID) 될 수 있도록 -defined 기능 나는 로직을 캡슐화하는 함수를 만드는 것이 좋습니다 것 쿼리가 성능이 중요한 위치에 있지 않습니다. 함수를 사용할 때의 이점은 비즈니스 변경이 발생할 가능성이있는 쿼리 유형을 사용한다는 것입니다. 예를 들어, 달러 이외에 유로화 또는 엔화로 소싱을 시작하거나 계산에 사용 된 규칙이 변경 될 수 있습니다. 함수에서 변환 논리를 캡슐화하면 추후 유지 관리에 도움이 될 수있는 추상 계층이 추가됩니다.

1

또 다른 방법은 다음과 같습니다

SELECT id, 
CASE WHEN price_brl IS NULL THEN (price_usd * tbl_2.Value) 
ELSE 
price_brl 
END AS Final_Price 
FROM tbl_1 
JOIN tbl_2 ON /*Join Conditions and then Where conditions*/ 

하지만 추천 할 것 중 하나 위의 Coallesce 옵션 (당신이 3 개 이상의 옵션이있는 경우), 또는 ISNULL (당신이 개 선택이 것 같습니다 이후).