有没有办法在单语句 SQL 查询中定义命名 constant/parameter?

Is there a way to define a named constant/parameter in a single-statement SQL query?

试图做类似的事情:

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

但收到错误消息 "Relation 'dates' does not exist"(在 Vertica 中)。是否有任何正确的方法来定义 constant/parameter。在实际示例中,查询包含定义时间范围内的多个选择,因此我想在一个地方维护值 constants/parameters 以允许它们在嵌套子查询中重复使用。

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

如果要在查询中使用 dates,则需要在 FROM 子句中包含它。您可以这样做:

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;

我仍然会做@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 语句中将其用作变量。请注意,这个变量是非常字面的,您需要包括任何标点符号、引号等。它不仅仅是一个值,它更像是一个模板。