У меня есть jsonb с именем attr
с ключом в формате 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'