Postgres Jsonb тип данных - PullRequest
       18

Postgres Jsonb тип данных

0 голосов
/ 29 августа 2018

Я использую PostgreSQL для создания таблицы на основе входных данных json, переданных моему Java-коду, и мне нужны проверки для ключей JSON, которые передаются в базу данных точно так же, как oracle, но проблема здесь заключается в том, что полное имя столбца типа данных jsonb, скажем, данные это один столбец. Считайте, что я получаю JSON в формате ниже -

{
  "CountActual": 1234,
  "CountActualCharacters": "thisreallyworks!"
  "Date": 09-11-2001
}

Правильный тип данных выше JSON: - number(10), varchar(50), date

Теперь для проверки правильности я использую ограничения

Запрос 1 -

ALTER TABLE public."Detail"
    ADD CONSTRAINT "CountActual" 
    CHECK ((data ->> 'CountActual')::bigint >=0 AND length(data ->> 'CountActual') <= 10);

- Работает нормально.

Но для Запрос 2 -

ALTER TABLE public."Detail"
    ADD CONSTRAINT "CountActualCharacters" 
    CHECK ((data ->> 'CountActualCharacters')::varchar >=0 AND length(data ->> 'CountActualCharacters') <= 50);

Я получаю ошибку ниже -

[ERROR: operator does not exist: character varying >= integer
HINT: No operator matches the given name and argument type(s). 
You might need to add explicit type casts.]

Я попробовал другой способ, например, -

ALTER TABLE public."Detail"
    ADD CONSTRAINT CountActualCharacters CHECK (length(data ->> 'CountActualCharacters'::VARCHAR)<=50)

Вышеуказанные ограничения работают успешно, но я не думаю, что это правильный путь, так как моя проверка не работает при вставке данных -

Insert into public."Detail" values ('{" 
  CountActual":1234,
  "CountActualCharacters":789
  "Date": 11-11-2009
}');

И его показы вставляются успешно при прохождении 789 в CountActualCharacters вместо varchar вроде "the78isgood!".

Поэтому, пожалуйста, кто-нибудь может предложить мне правильное ограничение для PostgreSQL для varchar, как и number, которое я написал в Query 1.

И, если возможно, для типа Дата также в формате DD-MM-YYYY.

Я только начал с PostgresSQL, простите, если я звучу глупо, но я действительно застрял здесь.

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете использовать jsonb_typeof(data -> 'CountActualCharacters') = 'string'

Обратите внимание на одну стрелку, так как ->> попытается преобразовать что-либо в строку.

Подробнее о функциях JSON в PostgreSQL вы можете прочитать здесь: https://www.postgresql.org/docs/current/static/functions-json.html

...