我是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上运行,但我想要一个可以在其他数据库上运行的通用解决方案。
答案 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;