【问题标题】:Setting a variable in ANSI SQL在 ANSI SQL 中设置变量
【发布时间】:2014-10-22 20:26:00
【问题描述】:

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

【问题讨论】:

    标签: sql netezza ansi-sql


    【解决方案1】:

    标准 (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 实际发送到数据库服务器之前被替换。

    【讨论】:

    • CTE 在 Netezza 中工作,但您可以使用“select '2014-01-01'::DATE”而不是“values (date '2014-01-01')”
    【解决方案2】:

    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;
    

    【讨论】:

    • 这正是我在写“一些 SQL 客户端提供定义变量的能力”时所指的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多