【问题标题】:How can I write a SELECT statement in which the condition is the result of a function如何编写条件是函数结果的 SELECT 语句
【发布时间】:2009-05-14 16:52:47
【问题描述】:

我想写一个SELECT语句如下:

SELECT field_a 
FROM my_table
WHERE field_b IN (my_function(field_c)).

这可能吗?

my_function 必须返回一个数组?

我使用的是 PostgreSQL 8.2

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:
    SELECT  *
    FROM    (
            SELECT  field_a, field_b, my_function(field_c) fc
            FROM    mytable
            ) q
    WHERE   field_b = fc
    

    你的函数的返回类型应该是SETOF(例如SETOF INTSETOF VARCHAR等)

    请注意,您可以像这样使用IN 样式表达式:

    SELECT  field_a, field_b
    FROM    mytable
    WHERE   field_b IN (SELECT my_function(field_c))
    

    ,但如果你的函数返回一个复杂类型,前一种风格更可取,因为你可以比较复杂类型的一个字段并在一个查询中返回另一个,如下所示:

    FUNCTION my_function RETURNS SETOF anothertable
    
    /* This will return a set of records of same layout as in table "anothertable" */
    
    SELECT  field_a, field_b, fc.column1, fc.column2
    FROM    (
            SELECT  field_a, field_b, my_function(field_c) fc
            FROM    mytable
            ) q
    WHERE   field_b = fc.column1
    

    我们在此处与column1 进行比较并返回column1column2

    这对于关联的子查询是不可能的。

    【讨论】:

    • 您对 SETOF 返回类型是正确的,但示例查询可能更简单 - “... WHERE field_b IN (SELECT my_function(field_c))”。
    • 越简单越好。子选择尤其是带有函数的子选择将成为性能杀手。派生表几乎总是优于子选择。
    【解决方案2】:

    只要 my_function 的返回类型只是一个与 field_b 类型相同的结果集(如 Varchar(20) 或 int),那么你应该没问题。

    【讨论】:

      猜你喜欢
      • 2011-08-08
      • 2021-08-19
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多