2014-05-08 3 views
2

나는 매우 어리석은 질문처럼 보입니다. :x <= :y하지만, 때 :x > :y 그것이 내가 원하는 행을 반환하지 않는 경우절 사이 - 매개 변수의 순서를 변경해야합니까?

SELECT id FROM myTable WHERE valueCol BETWEEN :x and :y; 

이 잘 작동 : 나는 같은 형태의 쿼리가! 이 경우에는 올바르게 작동하도록 변수를 수동으로 되돌려 야합니다.

변수의 순서가 중요하지 않은 between 절을 작성하는 방법이 있습니까?

추신 : 저는 SQL을 포함 시켰습니다. 이것은 일반적인 SQL 문제 일뿐입니다.

+1

[Google 검색 비용으로 누구나 무료로 사용할 수있는 오라클의 온라인 설명서] /docs.oracle.com/cd/B28359_01/server.111/b28286/conditions011.htm#SQLRF52147)는 x가 실제로 <= y 여야 함을 나타냅니다. –

+0

PS에 관해서 : 일반적인 SQL 문제인지 여부에 관계없이 이것을 "sql"으로 태그 지정하는 것이 좋습니다. 귀하의 질문은 오라클 SQL (오라클의 전략 분할, 최적의 서버 설정 등)과 관련이 있으므로이 "oracle"에 "SQL"을 더한 태그는 완벽합니다. –

답변

9

예 그것은 쉽게 : 오라클을 직접 확인하고 값을 교환하거나, 당신은 같은 것을 할 수 있고,하자 당신이 할 수있는

between case when :x <= :y then :x else :y end 
and case when :x <= :y then :y else :x end 
0

당신이 사건을 사용할 수 있습니다 알아 내면 :

BETWEEN LEAST(:x,:y) AND GREATEST(:x,:y) 
4

:

SELECT id 
FROM myTable 
WHERE valueCol BETWEEN LEAST(:x,:y) and GREATEST(:x,:y); 
+0

후속 조치에 대해 죄송합니다. 오라클이이 작업을 수행하는 데있어 성능 저하가 있습니까? –

+1

간단한 대답은 - 예와 아니오입니다. 예, 의심 할 여지없이 몇 가지 CPU주기를 소비하여 최소 및 최대를 실행하지만 아니요, 알 수 없습니다. 공유하고 즐기십시오. –

+1

@drew_w : 실제 비교를 수행하는 데 약간의 추가 작업이 있습니다. 더 큰 문제는 이것이 옵티마이 저가'valueCol'에 대한 술어를 만족시키기 위해 인덱스 범위 스캔 작업을 사용하지 않기로 결정할 지 여부입니다. (오라클은 exeuction plan을 개발할 때 카디널리티의 추정치를 얻기 위해 몇 가지 "변수 가변"을 수행 할 수 있음을 알고 있습니다. (이상적으로 오라클은 LEAST와 GREATEST 표현식을 평가하고 그 결과를 실행 계획 개발에 사용합니다. 어떤 차이를 만들지는 않을 것이다. 그러나 나는 그렇지 않은지 모른다.) – spencer7593