2016-07-05 92 views
1

试图做这样的事情:有没有办法在单个语句的SQL查询中定义一个命名常量/参数?

WITH 
dates as (SELECT '2015-01-01' as start, '2016-01-01' as end) 
SELECT * FROM my_table WHERE start_date >= dates.start AND end_date <= dates.end 

,但得到的错误消息“关系‘日期’不存在”(在Vertica的)。有没有适当的方法来定义一个常量/参数。在实际的例子中,查询在定义的时间范围内包含多个选择,因此我想将常量/参数值保存在一个位置,以便它们可以在嵌套子查询中重用。

如果可能,我想避免使用类似DECLARE/SET的语句,其中需要单独的一行。

+1

这是为什么标记Vertica和MySQL?这些是非常不同的数据库。我删除了MySQL标签,因为你的问题表明'WITH'有效,并且它不被MySQL支持。 –

+0

我不知道MySQL不支持'WITH',并且因为StackOverflow的建议我添加了MySQL。感谢您的更正,@GordonLinoff – BreakPhreak

+0

您正在使用哪个客户端进行连接?这些vsql脚本? – woot

回答

1

如果您在查询中需要,您需要在FROM子句中有dates。你可以这样做:

WITH dates as (SELECT '2015-01-01' as start, '2016-01-01' as end) 
SELECT t.* 
FROM my_table t JOIN 
    dates d 
    ON t.start_date >= d.start AND t.end_date <= d.end; 

注意:你也可以用CROSS JOIN做到这一点。我经常写的查询为:

WITH params as (
    SELECT '2015-01-01' as start, '2016-01-01' as end 
    ) 
SELECT t.* 
FROM params CROSS JOIN 
    my_table t 
WHERE t.start_date >= params.start AND t.end_date <= params.end; 
+0

所以使用常量来''JOIN'价格,对吧?这将使代码更不可读,因为子查询中有很多选择:( – BreakPhreak

2

我仍然会做@GordonLinoff提到什么(我怀疑它在查询计划产生太大影响),但如果你真的不想要或类似的功能,我会显示在最后...

你提到你打算使用vsql。你可以在那里做变量。

\set start '2015-01-01' 
\set end '2016-01-01' 
SELECT * 
FROM my_table 
WHERE start_date >= :start 
AND end_date <= :end; 

这是我想那种很好,因为你也可以做这样的事情:

\set start ''`date "+%Y-%m-%d %H:%M:%S"`'' 

或回声的任何命令的结果为,你可以在SQL语句中作为变量使用变量。请注意,这个变量是相当字面的,你需要包含任何标点符号,引号等。它不仅仅是一个值,它更像一个模板。

相关问题