Oracle

从Oracle 19c开始,数据库提供了内置的支持来处理JSON文档,并且可以直接在表中存储JSON数据。

--假设我们有一个名为PRODUCTS的表,其中包含一个名为ATTRIBUTES的列,用于存储产品属性的JSON数据。

--创建表并定义一个JSON类型字段的表
CREATE TABLE PRODUCTS (
    ID NUMBER PRIMARY KEY,
    NAME VARCHAR2(100),
    ATTRIBUTES CLOB CHECK (ATTRIBUTES IS JSON)
);

--插入两行数据
INSERT INTO PRODUCTS (ID, NAME, ATTRIBUTES) VALUES (1, 'Widget', '{"color": "blue", "size": "medium"}');
INSERT INTO PRODUCTS (ID, NAME, ATTRIBUTES) VALUES (2, 'Gadget', '{"color": "red", "size": "small"}');

--解析数据
SELECT ID, NAME, 
       JSON_VALUE(ATTRIBUTES, '$.color') AS COLOR, 
       JSON_VALUE(ATTRIBUTES, '$.size') AS sizes
FROM PRODUCTS;

MySQL

MySQL从5.7.8版本开始引入了对JSON数据类型的支持,并提供了一系列的函数来处理JSON数据。

--创建表并定义一个JSON类型字段的表
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    attributes JSON
);

--插入两行数据
INSERT INTO products (name, attributes) VALUES ('Widget', '{"color": "blue", "size": "medium"}');
INSERT INTO products (name, attributes) VALUES ('Gadget', '{"color": "red", "size": "small"}');

--解析数据
SELECT id, name, 
       JSON_UNQUOTE(JSON_EXTRACT(attributes, '$.color')) AS color, 
       JSON_UNQUOTE(JSON_EXTRACT(attributes, '$.size')) AS size
FROM   products;

SQLServer

SQLSERVER从2016版本开始支持OPENJSON函数。

--创建表并定义一个nvarchar(max)类型字段的表
CREATE TABLE Products (
    ProductId int PRIMARY KEY,
    Name nvarchar(50),
    Attributes nvarchar(max)
);

--插入两行数据
INSERT INTO Products (ProductId, Name, Attributes) VALUES (1, 'Widget', N'{"Color": "Blue", "Size": "Medium"}');
INSERT INTO Products (ProductId, Name, Attributes) VALUES (2, 'Gadget', N'{"Color": "Red", "Size": "Small"}');

-- 提取 JSON 字段中的单个值
SELECT ProductId, Name
, JSON_VALUE(Attributes, '$.Color') AS Color
, JSON_VALUE(Attributes, '$.Size') AS Size
FROM Products;

-- 解析 JSON 字符串并展开为行
SELECT *
FROM Products
CROSS APPLY OPENJSON(Attributes)
WITH (Color nvarchar(50) '$.Color',
      Size nvarchar(50) '$.Size');

PostgreSQL

PostgreSQL 从9.0版本开始支持 JSON 类型,从9.2版本开始支持 JSONB 类型。JSON写性能强,JSONB读性能强。

--创建表并定义一个JSONB类型字段的表
CREATE TABLE products (
    product_id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    attributes JSONB
);

--插入两行数据
INSERT INTO products (name, attributes) VALUES ('Widget', '{"Color": "Blue", "Size": "Medium"}');
INSERT INTO products (name, attributes) VALUES ('Gadget', '{"Color": "Red", "Size": "Small"}');

-- 提取 JSON 字段中的单个值
SELECT product_id, name
, (attributes->>'Color') AS color
, (attributes->>'Size') AS Sizes
FROM products;