在子查询中使用内联函数(在 WHERE 子句中)

Posted

技术标签:

【中文标题】在子查询中使用内联函数(在 WHERE 子句中)【英文标题】:Use inline function in subquery (in a WHERE clause) 【发布时间】:2021-12-02 13:06:26 【问题描述】:

在COTS 系统中,我可以输入SQL WHERE clause。

有效的 WHERE 子句示例:

worktype = 'Corrective Maintenance'

1 = (
    with 
        cte as (select 1 as calc from dual)
    select 
        calc 
    from 
        cte
    )

同样,我想知道是否可以在 WHERE 子句的子查询中使用 内联函数

这个内联函数在 SQL 客户端中独立工作:

with 
    function inline_f(p_num number) return number is 
    begin
        return p_num + 0;
    end;
select 
    inline_f(1) as calc 
from 
    dual

Calc
----
1

但是如果我将它包装在 WHERE 子句中的子查询中,那么我会得到一个错误(在 COTS 系统中,甚至在 SQL 客户端中):

--select * from a_tbl where

1 = (
    with 
        function inline_f(p_num number) return number is 
        begin
            return p_num + 0;
        end;
    select 
        inline_f(1) as calc 
    from 
        dual
    )

ORA-00921: unexpected end of SQL command
Invalid statement
ORA-00933: SQL command not properly ended

问题:

有没有办法?

【问题讨论】:

【参考方案1】:

有没有办法在子查询中使用内联函数(在 WHERE 子句)?

有,但我不确定这是否会对您有所帮助。我不知道什么是 COTS 系统,以及它是如何工作的。我了解用户只能输入WHERE 子句;但是您(作为开发人员) - 或者开发人员是谁,如果不是您 - 是否有权访问整个 SELECT 声明?

如果您在 WITH 子句中定义函数的查询不是*** SELECT 语句(在您的情况下不是),那么*** SELECT 必须包含 with_plsql 提示。 (无论如何,Oracle 称它为“提示”;它使用提示语法,但它不是提示,它实际上是一个编译器指令。)唉,这个 必须 在*** @987654328 @(表示查询的 SELECT 子句,最终用户无法访问)。

这就是我问的原因...如果为您的用户开发这些查询的人不介意将with_plsql 提示添加到***SELECT,那么您可以按照您的要求进行操作。如果用户在 WITH 子句中键入没有 PL/SQL 代码的 WHERE 子句,则提示不会造成任何伤害,因此没有理由不这样做;但是,就像我说的,我不知道 COTS 是什么意思,也不知道它是如何工作的。

【讨论】:

@BarbarosÖzhan - 正如答案所说,它必须在*** - then it works。 COTS = 商业的,现成的。 (他们已经为商业软件包付费,并没有对其进行定制。) @MT0 - 我发现了很多(谷歌工作),但我仍然不知道这意味着什么。例如,PeopleSoft 将是 COTS(我假设)。有些地方认为它不能因任何原因被触及,而另一些地方则使用 Oracle 提供的工具来更改开箱即用的内容。 OP能做到吗?我就是这个意思。

以上是关于在子查询中使用内联函数(在 WHERE 子句中)的主要内容,如果未能解决你的问题,请参考以下文章

sql面试题_SQl优化技巧_1注意通配符中like的使用,百分号放后面_2避免在where子句中对字段进行函数操作_3在子查询当中,尽量用exists代替in_4where子句中尽量不要使用(代码片

如何在子查询的 WHERE 子句中使用来自 UNNEST 的多个值?

在子查询中为数据透视列的值实现 WHERE 子句?

select 子句中的内联查询与 where 子句中的连接之间的差异 [重复]

如何在 WHERE 子句中使用混合文本和日期字段?

WHERE 子句中的 CASE