2014-10-22 3 views
1

저는 SQL에 익숙하지 않으며 ANSI SQL에서 변수를 설정하는 방법을 찾고 있습니다.ANSI SQL에서 변수 설정

select * from table1 
where first_date > ‘2014-01-01' 
and where second_date = ‘2014-01-01’ 
and where third_date < ‘2014-01-01’ 

하지만 내가 좋아하는 뭔가를 바라고은 : 나는이 가지고

set x = ‘2010-12-31’ 
select * from table1 
where first_date > x 
and where second_date = x 
and where third_date < x 

내가 저장 프로 시저에 대해 읽어을하지만 너무 단순 해 보이는 무언가에 대한 과잉처럼 보인다. 저는 Netezza를 사용하고 있지만 다른 데이터베이스에서도 작동 할 수있는 일반적인 솔루션을 원합니다.

답변

2

표준 (ANSI) SQL에는 변수가 없습니다. 하지만 일 수 있습니다. 표준 SQL에서는 한 번만 값을 가지는 공통 테이블 식을 사용합니다.

with data (the_date) as (
    values (date '2014-01-01') 
) 
select * 
from table1 
where first_date > (select the_date from data) 
    and second_date = (select the_date from data) 
    and third_date < (select the_date from data); 

위의 대부분의 DBMS에 작동합니다 :

다음

는 ANSI의 SQL입니다. 모두가 그와 같은 values 절을 지원하는 것은 아니지만 대개 일반 select 문을 사용하여 해결할 수 있습니다. 내가 네티을 사용한 적이대로 행 생성자합니다 ( values 절) 또는 공통 테이블 표현식합니다 ( with 절)

는 또한 일부 SQL 클라이언트는 변수를 정의 할 수있는 기능을 제공을 지원하는 경우

는 나도 몰라 SQL이 실제로 데이터베이스 서 v에 전송되기 전에 대체됩니다.

+0

열팽창 계수는 대신 "값 (날짜 '2014년 1월 1일')"당신 "을 선택 '2014년 1월 1일을':: DATE"를 사용하는 것이 – ScottMcG

0

a_horse_with_no_name의 솔루션은 절차 적 SQL 확장 영역에 포함되지 않는 유일한 순수 SQL 솔루션입니다. NZSQL CLI에만 한정되어 있기 때문에 요청한 것과 다른 솔루션이 있습니다. 그러나 이와 같은 변수를 사용할 수 있습니다.

TESTDB.ADMIN(ADMIN)=> \set x '\'2014-01-01\'' 

TESTDB.ADMIN(ADMIN)=> 
SELECT * 
FROM table1 
WHERE first_date < :x 
AND second_date = :x 
AND third_date = :x; 
+0

그건 내가 언급 정확히 무엇의, 네티에서 작동 "* 일부 SQL 클라이언트는 변수를 정의 할 수있는 기능을 제공합니다 *" –