SQL Server 如何在SQL中更新字符串化JSON对象中的数据?

ygya80vv  于 2023-01-16  发布在  其他
关注(0)|答案(4)|浏览(356)

所以我有三个数据库--Oracle数据库、SQL Server数据库和Postgres数据库。我有一个包含两列的表:namevalue都是文本,值是字符串化的JSON对象,需要更新嵌套值。
这是我目前拥有的:

name: 'MobilePlatform', 
value:
    '{
       "iosSupported":true,
       "androidSupported":false,
    }'

我想把{"enableTwoFactorAuth": false}加进去。

t1qtbnec

t1qtbnec1#

在PostgreSQL中,您应该能够做到这一点:

UPDATE mytable
SET MobilePlatform = jsonb_set(MobilePlatform::jsonb, '{MobilePlatform,enableTwoFactorAuth}', 'false');
ldioqlga

ldioqlga2#

Postgres中,jsonb的普通串联运算符||可以做到这一点:

UPDATE mytable
SET    value = value::jsonb || '{"enableTwoFactorAuth":false}'::jsonb
WHERE  name  = 'MobilePlatform';

如果顶层键"enableTwoFactorAuth"已经存在,它将被替换,所以它实际上是一个“upsert”。
或者使用jsonb_set()操作嵌套值。
text的强制转换隐式地作为赋值强制转换工作。有效地去除了任何不重要的空白)。
如果内容是有效的JSON,那么存储类型应该从json开始,在Postges中,jsonb更好,因为它更容易操作,但是它不能直接移植到前面提到的另外两个RDBMS。
(Or,可能是完全没有JSON的规范化设计。)

hfsqlsce

hfsqlsce3#

适用于ORACLE 21

update mytable
set json_col = json_transform(
    json_col,
    INSERT '$.value.enableTwoFactorAuth' = 'false'
)
where json_exists(json_col, '$?(@.name == "MobilePlatform")')
;

json_col为JSON或VARCHAR2时|具有IS JSON约束的CLOB列。
(but如果要在json_value.name上创建多值索引,则必须为JSON:

create multivalue index ix_json_col_name on mytable t ( t.json_col.name.string() );

inn6fuwd

inn6fuwd4#

您正在使用的两个数据库支持JSON数据类型,因此将它们作为字符串化的JSON对象放在Text列中没有意义。
甲骨文:https://docs.oracle.com/en/database/oracle/oracle-database/21/adjsn/json-in-oracle-database.html
PostgreSQL语言:https://www.postgresql.org/docs/current/datatype-json.html
除此之外,MSSQL Server还提供了处理JSON数据类型的方法。
MS SQL服务器:https://learn.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server?view=sql-server-ver16
在上述任何一个数据库中使用JSON类型列都可以使您使用它们的JSON函数来执行您正在寻找的任务。
如果只需要使用Text,那么可以使用replace在JSON末尾添加键值对

update dataTable set value = REPLACE(value, '}',",\"enableTwoFactorAuth\": false}") where name = 'MobilePlatform'

这里dataTable是表的名称。
更干净、风险更小的方法是使用应用程序连接到数据库,并使用JSON方法,如Javascript中的JSON.parse和Python中的JSON.loads。这将为您提供JSON对象(Python中的字典)。您也可以在其他语言中寻找类似的方法。
但是我建议,如果可能的话,尽可能使用JSON列而不是Text来存储JSON值。

相关问题