删除 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',''));
编号 |产品 |描述 -: | :------------ | :------------------------------------------------ 1 |卡车空间 | “车轮”:4,“座位”:3,“燃料”:“柴油”,“里程”:8select * from product_json_table
db小提琴here
【讨论】:
以上是关于删除 JSON 键中的前导和尾随空格的主要内容,如果未能解决你的问题,请参考以下文章