ОШИБКА: функция regexp_matches (jsonb, unknown) не существует в Tableau, но работает в других местах - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть столбец под названием «Пекарская деятельность», значения которого представляют собой все JSON, которые выглядят так:

{"flavors": [
    {"d4js95-1cc5-4asn-asb48-1a781aa83": "chocolate"},
    {"dc45n-jnsa9i-83ysg-81d4d7fae": "peanutButter"}], 
 "degreesToCook": 375, 
 "ingredients": {
    "d4js95-1cc5-4asn-asb48-1a781aa83": [
        "1nemw49-b9s88e-4750-bty0-bei8smr1eb", 
        "98h9nd8-3mo3-baef-2fe682n48d29"]
    },
 "numOfPiesBaked": 1,
 "numberOfSlicesCreated": 6
}

Я пытаюсь извлечь количество пирогов, выпекаемых с помощью функции регулярных выражений в Таблице.В частности, это:

REGEXP_EXTRACT([Bakery Activity], '"numOfPiesBaked":"?([^\n,}]*)')

Однако, когда я пытаюсь бросить это вычисляемое поле в мою текстовую таблицу, я получаю сообщение об ошибке:

ОШИБКА: функция regexp_matches (jsonb, неизвестно) не существует;

Ошибка при выполнении запроса

Стоит отметить, что моим источником данных является PostgreSQL, который поддерживает функции регулярных выражений Tableau;не во всех моих записях есть numOfPiesBaked;когда я запускаю это в симуляторе, я получаю правильное извлечение (фактически, я получаю "numOfPiesBaked": 1", но удаление имени поля является проблемой в другой раз).

Что может быть причиной этой ошибки?

1 Ответ

0 голосов
/ 17 декабря 2018

Вкратце: неверный тип данных, неправильная функция, неправильный подход.

REGEXP_EXTRACT - это, очевидно, уровень абстракции вашего клиента (таблица) , который переводится в regexp_matches()для Postgres.Но эта функция ожидает ввода text.Поскольку для jsonb -> text (по уважительным причинам) не приведено присваивание, для его работы необходимо добавить явное приведение, например:

SELECT regexp_matches("Bakery Activity"::text, '"numOfPiesBaked":"?([^\n,}]*)')

(Второй аргумент может бытьнетипизированный строковый литерал, разрешение типа функции Postgres может отложить подходящий тип данных text.)

Современные версии Postgres также имеют regexp_match(), возвращающую одну строку (в отличие от regexp_matches), которая выглядит как лучший перевод .

Но регулярные выражения - это неправильный подход для начала.
Используйте простой оператор json / jsonb ->>:

SELECT "Bakery Activity"->>'numOfPiesBaked';

Возвращает '1' в вашем примере.
Если вы знаете, что значение является действительным целым числом, выможно сразу же разыграть:

SELECT ("Bakery Activity"->>'numOfPiesBaked')::int;
...