2017-01-24 4 views
2

Как выполнить цикл через массив, содержащийся в поле jsonb внутри функции PLPGSQL в Postgres 9.6?Как пропустить массив, содержащийся в поле JSONb?

Это мое поле заявление:

CREATE TABLE afact_rule(
    ... 
    expressions   jsonb, 
    ... 
) 

И это мой ФУНКЦИЯ:

 FOR expression IN SELECT * FROM json_array_elements(rule.expressions) LOOP 
      CASE expression.field 
       WHEN 'task_id' THEN 
        ... whatever ... 
      END CASE; 
     END LOOP; 

И это ошибка я получаю при его использовании:

LINE 1: SELECT * FROM json_array_elements(rule.expressions) 
        ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 
QUERY: SELECT * FROM json_array_elements(rule.expressions) 

Каков наилучший (и эффективный) подход к циклу через массив con в поле jsonb?

Содержание rule.expressions является:

[{"field": "dep_id", "value": 1, "operator_code": 1}, 
    {"field": "title", "value": "customer", "operator_code": 2}] 
+0

'выбрать * из "правил", г json_array_elements (r.expressions)' –

+0

@a_horse_with_no_name, неа, не работает либо. Я думаю, что ошибка означает, что нет такой функции, которая принимает аргумент 'jsonb' в Postgres. Итак, должна быть какая-то другая функция для 'jsonb' – Nulik

+0

Ах, не видел' jsonB'. Для этого вам нужно использовать 'jsonB_array_length', конечно, –

ответ

2

Как @a_horse commented используйте jsonb_array_elements() для unnest в jsonb массив. Кроме того, я предлагаю [INNER] JOIN вместо CROSS JOIN. CROSS JOIN это подробный вариант синтаксиса вариант - и связывает более плотно, чем - простой запятой (,):

SELECT * -- do something? 
FROM afact_rule a 
JOIN LATERAL jsonb_array_elements(a.expressions) exp ON exp->>'field' = 'task_id'; 

Это должно быть наиболее эффективным, чтобы устранить не могут быть отнесены элементы (строки) и в состоянии JOIN немедленно. (Синтаксис очень ясно, даже если это приводит к тому же план запроса, как позже WHERE условия в любом случае.)

LATERAL ключевое слово является необязательным шум в этом случае, так как предполагается, в любом случае для возвращающих набор функций (SRF) в предложении FROM.

exp - это таблица и псевдоним столбца для результата функции SRF здесь.

Похожие: