我有一个名为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'