删除 JSON 键中的前导和尾随空格

Posted

技术标签:

【中文标题】删除 JSON 键中的前导和尾随空格【英文标题】:Remove leading and trailing whitespaces in JSON keys 【发布时间】: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 问题。但是垃圾被另一个我们没有太多控制权的应用程序转储到数据库中。 【参考方案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

【讨论】:

以上是关于删除 JSON 键中的前导和尾随空格的主要内容,如果未能解决你的问题,请参考以下文章

如何删除前导和尾随的空格以及字符串中的多个空格? [复制]

前导和尾随空格剪切 + 中间空格替换

如何删除 MySQL 字段中的前导和尾随空格?

如何删除前导和尾随空格?

在C语言编程中啥叫前导空格,啥叫尾随空格

XSLT 删除所有属性的前导和尾随空格