我正在使用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,如果我听起来很傻,请原谅我,但我真的被困在这里。
答案 0 :(得分:1)
您可以使用jsonb_typeof(data -> 'CountActualCharacters') = 'string'
请注意单个箭头,因为->>
会尝试将任何内容转换为字符串。
您可以在此处阅读有关PostgreSQL中JSON函数的更多信息: https://www.postgresql.org/docs/current/static/functions-json.html