【问题标题】:Migrate full table to json/clob column in another table将全表迁移到另一个表中的 json/clob 列
【发布时间】:2020-06-01 12:56:33
【问题描述】:

我想从以下 table1 迁移数据:

NAME | Surname
-----+---------
Name1| Surname1
Name2| Surname2

进入 table2 作为一个 clob (nclob,nvarchar(max),json.. etc.) 列:

NAME | JSON_COLUMN
-----+-------------------------------
NAME1| {Name: Name1,Surname: Surname1}
NAME2| {Name: Name2,Surname: Surname2}

我想知道进行此类迁移的最佳方法是什么?

有没有可以将表格转换成json格式的函数,以便我可以将其插入到新表格中?

类似这样的:

insert into table2 (JSON_TABLE) select (table1 as json) from table1

【问题讨论】:

  • 您的问题被标记为多个数据库产品,答案取决于您使用的版本以及版本。缩小您的问题范围。
  • @DanGuzman 需要一个通用的解决方案,如果可能的话
  • @MasterYi:JSON 函数是高度特定于供应商的,因此对于这个问题没有通用解决方案。正如 Dan Guzman 所说,您应该选择最相关的数据库。
  • @GMB 好的,我才会离开 oracle

标签: sql json oracle


【解决方案1】:

在oracle中,你可以使用json_object():

select 
    name,
    json_object('Name' value name, 'Surname' value surname) js
from mytable

Demo on DB Fiddle

with mytable as (
    select 'Name1' name, 'Surname1' surname from dual
    union all select 'Name2', 'Surname2' from dual
)
select 
    name,
    json_object('Name' value name, 'Surname' value surname) js
from mytable
姓名 | JS :---- | :------------------------------------------------ 姓名1 | {"姓名":"姓名 1","姓氏":"姓氏 1"} 姓名2 | {"姓名":"姓名 2","姓氏":"姓氏 2"}

【讨论】:

  • 适用于 oracle 12.2+,在 12c1 ORA-46099:功能不受支持或未实现,我想我必须在选择中手动创建 json。
  • @MasterYi:确实,在 2016 年发布的 Oracle 12.2 中添加了 json 支持。
【解决方案2】:

在 Oracle 12c 及更高版本中,您需要先使用 JSON_OBJECT 转换列值,然后再转换为 CLOB,并且为了正确使用 JSON,请使用 FORMAT JSON(SQL 字符串值 'true''false' 将转换为JSON Booleantruefalse。)

例子:

SQL> WITH TABLE1 AS (
  2      SELECT 'Name1' NAME, 'Surname1' SURNAME FROM DUAL
  3      UNION ALL
  4      SELECT 'Name2', 'Surname2' FROM DUAL
  5  )
  6  SELECT
  7      NAME,
  8      TO_CLOB(JSON_OBJECT ( 'Name' VALUE NAME,
  9                    'Surname' VALUE SURNAME
 10                    FORMAT JSON )) AS "JSON_TABLE"
 11  FROM
 12      TABLE1;

NAME      |JSON_TABLE
----------|--------------------------------------------------
Name1     |{"Name":"Name1","Surname":Surname1}
Name2     |{"Name":"Name2","Surname":Surname2}

SQL>

对于Oracle 11g及更低版本,您需要自己创建JSON,如下:

SQL> WITH TABLE1 AS (
  2      SELECT 'Name1' NAME, 'Surname1' SURNAME FROM DUAL
  3      UNION ALL
  4      SELECT 'Name2', 'Surname2' FROM DUAL
  5  )
  6  SELECT
  7      NAME,
  8      to_clob('{"Name:"' || NAME || '","Surname":'||SURNAME || '}') as "JSON_TABLE"
  9  FROM
 10      TABLE1;

NAME      |JSON_TABLE
----------|--------------------------------------------------
Name1     |{"Name:"Name1","Surname":Surname1}
Name2     |{"Name:"Name2","Surname":Surname2}

SQL>

Oracle 11g 中的另一个选项是使用 sql*plus 命令行界面,如下所示:

set sqlformat json

然后SELECT * FROM TABLE1 会生成json 格式的结果,但是你需要使用spool 将其导出到某个文件,然后将其加载到TABLE2。 (可能是冗长的方法)

干杯!!

【讨论】:

  • 还必须重命名 / \ 和 ' 字符,如果它们存在,它们会使 json 无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 2020-05-19
  • 2015-03-21
  • 2017-01-23
相关资源
最近更新 更多