在ANSI SQL中设置变量

时间:2014-10-22 20:26:01

标签: sql netezza ansi-sql

我是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 个答案:

答案 0 :(得分:3)

标准(ANSI)SQL没有变量。但是你在标准SQL中可以做的是使用公共表表达式只有一次值。

以下是ANSI 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。并非所有这些都支持这样的values子句,但通常可以使用普通的select语句来解决这个问题。

由于我从未使用过Netezza,我不知道它是否支持行构造函数(values子句)或公用表表达式(with子句)

此外,一些SQL客户端提供了在SQL实际发送到数据库服务器之前定义替换的变量的能力。

答案 1 :(得分: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;