Как выбрать из JSONB с помощью связанного текстового ключа? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть 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'

...