Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql PostgresJSONB数据类型_Sql_Postgresql_Jsonb - Fatal编程技术网

Sql PostgresJSONB数据类型

Sql PostgresJSONB数据类型,sql,postgresql,jsonb,Sql,Postgresql,Jsonb,我正在使用PostgreSQL根据提供给Java代码的json输入创建一个表,并且我需要对在数据库中传递的json键进行验证,就像oracle一样,但这里的问题是整个jsonb数据类型列名让我们假设数据是单列。考虑我在下面的格式中得到JSON - { "CountActual": 1234, "CountActualCharacters": "thisreallyworks!" "Date": 09-11-2001 } 以上json的正确数据类型:-number10,varchar

我正在使用PostgreSQL根据提供给Java代码的json输入创建一个表,并且我需要对在数据库中传递的json键进行验证,就像oracle一样,但这里的问题是整个jsonb数据类型列名让我们假设数据是单列。考虑我在下面的格式中得到JSON -

{
  "CountActual": 1234,
  "CountActualCharacters": "thisreallyworks!"
  "Date": 09-11-2001
}
以上json的正确数据类型:-number10,varchar50,date

现在要对其进行验证,我使用的是约束

问题1-

我试过另一种方式也喜欢-

ALTER TABLE public."Detail"
    ADD CONSTRAINT CountActualCharacters CHECK (length(data ->> 'CountActualCharacters'::VARCHAR)<=50)
当传入789 in count实际字符而不是像78isgood!那样的varchar时,它显示insert成功

所以,请任何人给我建议一个适合varchar的PostgreSQL约束,就像我在查询1中写的那个数字一样

如果可能,日期类型也采用DD-MM-YYYY格式

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

你可以使用jsonb_typeofdata->“CountActualCharacters”='string'

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

您可以在此处阅读有关PostgreSQL中JSON函数的更多信息:

你对Oracle这样的公司是什么意思?Oracle只能验证JSON是否在结构上有效,仅此而已。如果确实需要数据类型验证,则使用具有正确数据类型的常规列。这是我的错误。现在,我需要验证输入json的内容。整个json数据都在单列中。buddy….您的检查约束验证密钥CountActualCharacters不能像varchar50一样存储超过50个字符。为什么在存储789这样的3个字符时会失败呢?谢谢alexey,但在那篇文章中没有提到varchar,如果我使用string,那么json中也包含空格和空格,它们将通过验证。我需要这个thu45io89来验证不是ths 097 ndkn lp.:您混淆了JSON类型和DB类型。他们是不同的。不接受空格是您的业务逻辑,不是某个类型可以验证的。@Ankur:您应该编辑您的问题并添加您当前在Oracle中使用的检查约束
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
}');