Postgres 比较来自 json 和 table 的字符串

Postgres comparing strings from json and table

我有以下 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$;

我称之为:

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

我在电子邮件列中有一行 'x@x',定义为 VARCHAR(100)。以下SQLreturns我的行:

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

存储函数内的通知调用returns:

注意:(“x@x”)

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

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

据推测,您需要将电子邮件 提取为文本 ,如下所示:

user_email := req ->> 'email';

-> 提取一个 json 字符串 ,因此对于您的样本数据,这会产生:"x@x".

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