【问题标题】:How to declare a constant in an SQL query?如何在 SQL 查询中声明常量?
【发布时间】:2014-09-23 18:03:18
【问题描述】:

我正在使用 Oracle 11g R2。有没有办法在同一表达式中的 SQL 查询之前为从表中选择的单个值提供名称(别名)?那是一条 SQL 命令,我的意思是,没有 PL/SQL。

我最接近的是:

WITH
Approved AS (SELECT c.value FROM configuration c WHERE c.code = 'Approved'),
Arrived AS (SELECT c.value FROM configuration c WHERE c.code = 'Arrived'),
Scheduled AS (SELECT c.value FROM configuration c WHERE c.code = 'Scheduled')

SELECT *
FROM list l WHERE l.status_key > (SELECT value FROM Approved);

我正在寻找类似的东西,比如说:

WITH
Approved AS CONSTANT (SELECT c.value FROM configuration c WHERE c.code = 'Approved'),
Arrived AS CONSTANT (SELECT c.value FROM configuration c WHERE c.code = 'Arrived'),
Scheduled AS CONSTANT (SELECT c.value FROM configuration c WHERE c.code = 'Scheduled')

SELECT *
FROM list l WHERE l.status_key > Approved;

我不想内联该值的 select 语句的原因是我的查询已经足够复杂,如果可能的话,我宁愿去除其中的一些复杂性。

【问题讨论】:

    标签: sql oracle oracle11gr2


    【解决方案1】:

    我有时会使用这样的结构:

    WITH const as
          (select max(case when c.code = 'Approved' then c.value end) as Approved,
                  max(case when c.code = 'Approved' then c.value end) as Approved,
                  max(case when c.code = 'Scheduled' then c.value end) as Scheduled
           from configuration c
          ),
          . . .
    SELECT
    FROM const cross join
         list l
    WHERE status_key > Approved;
    

    有时如果我需要查询中不同位置的常量,那么我必须多次引入const CTE。

    【讨论】:

    • 我试图避免某种形式的连接,因为在我看来这有点矫枉过正。不过,我不知道是否有其他选择,我可能只需要忍受更复杂的查询。
    • @shwartz 。 . .单行表的cross join 不会有太多开销。
    【解决方案2】:

    简短的回答是否定的——你不能那样做。

    您可以创建一个视图来隐藏一些初始复杂性。

    ...或者,如果您真的想要,您可以创建一个函数,并将其用作常量...类似于(不包括任何错误处理):

    CREATE OR REPLACE FUNCTION config_code (code IN VARCHAR2) 
    RETURN configuration.value%TYPE AS
    
    value       configuration.value%TYPE;
    
    BEGIN
        SELECT c.value INTO value FROM configuration c WHERE c.code = code;
        RETURN value;
    END;
    

    然后您可以将其用作:

    SELECT * FROM list l WHERE l.status_key > config_code('Approved');
    

    【讨论】:

      猜你喜欢
      • 2022-08-04
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      相关资源
      最近更新 更多