Как я могу динамически обновить все значения в массиве в столбце jsonb? - PullRequest
1 голос
/ 13 января 2020

Я работаю с knex в node.js проекте на PostgreSQL дБ. Будет использовать knex.schema.raw (raw SQL) для выполнения sh this.

Мне нужно обновить все экземпляры имени сорта ("1st", et c) в " grades "массив объекта json в столбце jsonb. «классы» - это одно значение во всем объекте json, что является уроком.

Массив в настоящее время содержит что-то вроде "grades": ["Pre-K", "K", "4th", "5th", "6th", "7th", "8th"], и он должен стать "grades": ["PK", "K", "4", "5", "6", "7", "8"].

В основном Мне нужны все экземпляры

["Pre-K", "K", "1st", 2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", "10th", "11th", "12th"]

, чтобы быть

["PK", "K", "1", 2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]

Есть ли способ проверить содержимое массива jsonb, получить индекс оценки и обновить этот индекс до желаемой оценки? Или другой способ преобразовать данные массива в столбец типа jsonb?

(Моя первоначальная идея состояла в том, чтобы создать список каждой перестановки комбинации ["Pre-K", "K", "1st", 2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", "10th", "11th", "12th"] и просто поменять нужный массив из данные, которые существуют, но кажутся немного неуклюжими, хотя и технически возможными. При этом мне все равно нужно найти индекс элемента в массиве в ячейке jsonb.)

1 Ответ

2 голосов
/ 13 января 2020

Используйте регулярное выражение для устранения избыточных подстрок.

update my_table
set json_col = jsonb_set(
        json_col, 
        '{grades}', 
        (
            select jsonb_agg(regexp_replace(value, 're-|st|nd|rd|th', ''))
            from jsonb_array_elements_text(json_col->'grades')
        )
    );

Db <> fiddle.

Более простая и быстрая версия (хотя ее можно считать немного хаки):

update my_table
set json_col = jsonb_set(
        json_col,
        '{grades}',
        regexp_replace(json_col->>'grades', 're-|st|nd|rd|th', '', 'g')::jsonb
    )

Подробнее о Регулярные выражения POSIX.

...