Postgres Jsonb数据类型

时间:2018-08-29 16:34:42

标签: sql postgresql jsonb

我正在使用PostgreSQL根据给我的Java代码提供的json输入创建一个表,并且我需要对传递给数据库的JSON键进行验证,就像oracle一样,但是这里的问题是整个jsonb数据类型列名都可以说< strong>数据是单列。考虑我以以下格式获取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
}');

当在CountActualCharacters中传递789而不是像“ the78isgood!”这样的varchar时,其显示成功插入。

所以请有人建议我为varchar设置适当的PostgreSQL约束,就像我在查询1中编写的number一样。

如果可能的话,日期类型也可以使用DD-MM-YYYY格式。

我刚开始使用PostgresSQL,如果我听起来很傻,请原谅我,但我真的被困在这里。

1 个答案:

答案 0 :(得分:1)

您可以使用jsonb_typeof(data -> 'CountActualCharacters') = 'string'

请注意单个箭头,因为->>会尝试将任何内容转换为字符串。

您可以在此处阅读有关PostgreSQL中JSON函数的更多信息: https://www.postgresql.org/docs/current/static/functions-json.html