【问题标题】:Postgres function input parameter as TEXT Array problemPostgres 函数输入参数作为 TEXT Array 问题
【发布时间】:2021-02-11 16:59:58
【问题描述】:

我的桌子看起来像

CREATE TABLE dev.clbk_logs
(
    id bigint NOT NULL,
    clbk_typ character varying(255) COLLATE pg_catalog."default",
    clbk_json json,
    cre_dte timestamp without time zone,
    ld_id bigint,
    ld_num character varying(255) COLLATE pg_catalog."default",
    mod_dte timestamp without time zone,
    CONSTRAINT clbk_logs_pkey PRIMARY KEY (id)
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

我的功能是

CREATE OR REPLACE FUNCTION dev.my_method(p_callback_types TEXT[], p_days_ago INT) 
RETURNS SETOF dev.clbk_logs 
    LANGUAGE 'plpgsql'
AS $BODY$      
BEGIN
    return query
    SELECT * FROM dev.clbk_logs  
    WHERE  (clbk_Typ::TEXT) IN (($1))  AND (current_date - cre_dte::date)< p_days_ago;
       
END;
$BODY

有人可以帮助解决上面的问题,并且应该得到预期的结果。 我想在查询中传递一个字符串数组。

我得到的错误是

LINE 2:  WHERE  (clbk_Typ::TEXT) IN (($1))  AND (current_date - cre_...
                                 ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
QUERY:  SELECT * FROM dev.clbk_logs  
    WHERE  (clbk_Typ::TEXT) IN (($1))  AND (current_date - cre_dte::date)< p_days_ago
CONTEXT:  PL/pgSQL function dev.my_method(text[],integer) line 3 at RETURN QUERY
SQL state: 42883

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您需要在数组中使用= any() 而不是IN

    也不需要转换为::text。为了便于阅读,我建议使用参数名称,而不是数字:

    CREATE OR REPLACE FUNCTION dev.my_method(p_callback_types TEXT[], p_days_ago INT) 
    RETURNS SETOF dev.fourkites_clbk_logs 
        LANGUAGE plpgsql
    AS $BODY$      
    BEGIN
        return query
        SELECT * 
        FROM dev.fourkites_clbk_logs  
        WHERE clbk_Typ = any (p_callback_type)  
          AND (current_date - cre_dte::date) < p_days_ago;
    END;
    $BODY
    

    请注意,如果您曾经创建过索引,则您在 cre_dte 上的条件不能使用索引。如果您希望该条件能够使用索引,请将其更改为:

    and cre_dte >= current_date - p_days_ago;
    

    【讨论】:

    • 谢谢@a_horse_with_no_name 但有问题,因为结果如下所示 "(194507,UPDATE,"{""Scac"": ""HLCU"", ""Tags"": ["" 0001311330""], ""Shipper"": ""mercedesbenz-usa"", ""Latitude"": ""41.0"", ""Location"": ""41.00, -32.30"", ""Timezone" ": ""EU"", ""经度"": ""-32..7"", ""时间戳"": ""2020-11-22T00:50:46+01:00"", "" LoadNumber"": ""HLCUS-BU 3082"", ""MessageType"": ""UPDATE"", ""TimezoneOffset"": 300, ""FourKitesLoadId"": 85061, ""ReferenceNumbers"": ["" HLBU 3081422"", ""026627449""], ""TimezoneShortName"": ""CET""}","2020-11-22 00:01:37.274",85417061,"HLCUS-81422",NULL)"
    • 结果看起来像在单列中,它们不在不同的列中。缺少什么
    • 这是一个不同的问题,已经得到了回答,例如这里:stackoverflow.com/questions/49299858stackoverflow.com/questions/14628771/…
    • 是的,很抱歉我一开始没有提到。
    • 它对我有用,我从上面的块中得到了预期的结果。谢谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多