如何从带有串联文本键的jsonb中选择?

时间:2019-04-10 00:55:32

标签: postgresql jsonb

我有一个名为attr的jsonb,它的密钥格式为this.is.a.x

  • x可以包含许多其他字符串。

为什么对以下查询返回NULL

SELECT attr->>'this.is.a.'||x FROM test;

但是,如果我将变量k声明为k := 'this.is.a.'||x,则可以得到以下查询的结果:

SELECT attr->>k FROM test;

我有一个DBFiddle对此进行了显示,但我将在此处提供示例。

设置:

CREATE TABLE test
( id serial
, attr jsonb
);

CREATE FUNCTION key_test(x text)
RETURNS SETOF text
AS $$
DECLARE
    k text DEFAULT '1.'||x;
BEGIN
    RETURN QUERY
    SELECT attr->>k FROM test;
END;
$$  LANGUAGE plpgsql;

INSERT INTO test (attr)
VALUES (jsonb_build_object('1', 'one', '1.2', 'one.two'))
;

测试:

SELECT attr->>'1'       AS col1
     , attr->>'1.'||'2' AS col2
FROM test;

| col1     | col2     |
| -------- | -------- |
| one      |          |

SELECT *
FROM key_test('2');

| key_test |
| -------- |
| one.two  |

更新: 我发现我可以使用attr->>('1.'||'2')来做到这一点,但我仍然想知道为什么。我假设这只是解析错误,而Postgres实际在做什么(attr->>'1.')||'2'

0 个答案:

没有答案