【问题标题】:Remove leading and trailing whitespaces in JSON keys删除 JSON 键中的前导和尾随空格
【发布时间】:2019-07-03 17:01:47
【问题描述】:

我正在尝试使用 JSON_EXTRACT 从我的 MariaDB 服务器获取 JSON 值。但是,有些 JSON 键有很多空格,如行尾、空格、制表符等。数据已经存在。因此我无法给出正确的密钥名称,因为密钥包含空格。请注意,JSON 值中也存在空格,但我们可以使用 TRIM() 函数从值中删除空格。但是我们可以做些什么来修剪键名呢?

例如:

CREATE TABLE test.product_json_table (
   id INT AUTO_INCREMENT NOT NULL,
   product VARCHAR(20) NOT NULL,
   description LONGTEXT ASCII,
  PRIMARY KEY (id),
    CHECK (JSON_VALID(description))
) ENGINE = InnoDB ROW_FORMAT = DEFAULT;



INSERT INTO test.product_json_table(product, description) 
VALUES( 'truck_space', '{"     \r\nwheels  ": 4, "seats": 3, "  fuel   ": "diesel", "  \r\n mileage     ": 8}');

以下查询不起作用:

SELECT id, product, description 
FROM test.product_json_table
WHERE JSON_EXTRACT(description, '$.wheels') > 2;

查询不起作用,因为 JSON 键“轮子”中有空格。关键“里程”也是如此。

我们如何解决这个问题?提前致谢。

【问题讨论】:

  • 我将通过在将输入插入数据库之前修剪输入中的空格来解决此问题。但您也可以提取带引号的密钥:JSON_EXTRACT(description, '$." \r\nwheels "')。我现在不在 MySQL 5.7 实例附近,所以我无法对其进行测试。
  • 这也与您的问题无关,但我建议使用JSON data type 而不是 LONGTEXT。
  • 我只能说 GIGO。
  • 感谢您的建议。我忘了提到的问题是我没有对数据库的写访问权限。它正在由另一个应用程序填充。所以让我试试比尔的建议。哦,我使用的是 MariaDB 10.2.3,因此没有 JSON 数据类型,他们建议使用 LONGTEXT。我尝试后会更新。谢谢大家!
  • 瑞克,你是对的。这是一个典型的 GIGO 问题。但是垃圾被另一个我们没有太多控制权的应用程序转储到数据库中。

标签: mysql sql json mariadb


【解决方案1】:

除了@BillKarwin 建议在将空格输入数据库之前修剪空格外,您还可以更新数据库中的所有值以删除虚假空格:

UPDATE product_json_table
SET description = REGEXP_REPLACE(description, '\\s|\\r|\\n','');

然后您的原始查询将起作用:

SELECT id, product, description 
FROM product_json_table
WHERE JSON_EXTRACT(description, '$.wheels') > 2;

输出:

id  product         description
1   truck_space     {"wheels":4,"seats":3,"fuel":"diesel","mileage":8}

Demo on dbfiddle

更新

您也可以即时执行空白替换,尽管这比使用上面的UPDATE 查询永久删除它的效率要低得多:

SELECT id, product, REGEXP_REPLACE(description, '\\s|\\r|\\n','') AS description 
FROM product_json_table
WHERE JSON_EXTRACT(REGEXP_REPLACE(description, '\\s|\\r|\\n',''), '$.wheels') > 2

输出:

id  product         description
1   truck_space     {"wheels":4,"seats":3,"fuel":"diesel","mileage":8}

Demo on dbfiddle

【讨论】:

  • 似乎只有这样才能工作。没有更新,这是行不通的。试图获得对数据库的写访问权限,不确定我们是否可以......
  • 哇!谢谢尼克。你救了我的一天!标记为已回答。
【解决方案2】:

你可以使用

REGEXP_REPLACE(query, '\\s|\\r|\\n','')

CREATE TABLE product_json_table (
   id INT AUTO_INCREMENT NOT NULL,
   product VARCHAR(20) NOT NULL,
   description LONGTEXT ASCII,
  PRIMARY KEY (id),
    CHECK (JSON_VALID(description))
) 
INSERT INTO product_json_table(product, description) 
VALUES( 'truck_space', REGEXP_REPLACE('{"     \r\nwheels  ": 4, "seats": 3, "  fuel   ": "diesel", "  \r\n mileage     ": 8}', '\\s|\\r|\\n',''));
select * from product_json_table
编号 |产品 |描述 -: | :------------ | :------------------------------------------------ 1 |卡车空间 | {“车轮”:4,“座位”:3,“燃料”:“柴油”,“里程”:8}

db小提琴here

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 2012-02-28
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2017-04-30
    • 2021-09-13
    相关资源
    最近更新 更多