【问题标题】:Postgres comparing strings from json and tablePostgres比较来自json和表的字符串
【发布时间】:2020-12-09 21:14:37
【问题描述】:

我有以下 postgres 存储函数:

CREATE OR REPLACE FUNCTION wg.get_user(
    req jsonb)
    RETURNS jsonb
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
AS $BODY$

DECLARE
    user_email VARCHAR;
    resp JSONB;
BEGIN
    user_email := req->'email';
    raise notice '(%)', user_email;
    SELECT row_to_json(t) INTO resp FROM (
        SELECT email, name, default_project_id
        FROM wg.users
        WHERE (email = user_email)
    ) t;
    RETURN resp;
END;

$BODY$;

我称之为:

选择 wg.get_user('{ "email": "x@x" }'::jsonb);

我在电子邮件列中有一行包含“x@x”,定义为 VARCHAR(100)。以下 SQL 返回我的行:

    SELECT email, name, default_project_id
    FROM wg.users
    WHERE email = 'x@x' 

存储函数中的通知调用返回:

注意:("x@x")

但是,该函数返回 NULL,因为显然 WHERE 子句不匹配,即使两者似乎都评估为“x@x”。

如果我将比较更改为不等式(电子邮件 > user_email 有效),它会起作用。

【问题讨论】:

    标签: sql json postgresql where-clause stored-functions


    【解决方案1】:

    大概,您需要将电子邮件提取为文本,如下所示:

    user_email := req ->> 'email';
    

    -> 提取 json 字符串,因此对于您的示例数据,这会产生:"x@x"

    另一方面,->> 将数据提取为文本,从而产生x@x

    【讨论】:

    • 谢谢,就是这样。我没有注意到 JSON 字符串周围仍然有引号!
    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多