Удалить начальные и конечные пробелы в ключах JSON - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь получить значение JSON с моего сервера MariaDB, используя JSON_EXTRACT.Тем не менее, есть некоторые ключи 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 "колеса".То же самое и в случае с ключом «пробег».

Как мы решаем эту проблему?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

В дополнение к предложению @ 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}

Демонстрация на 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}

Демо на dbfiddle

0 голосов
/ 09 февраля 2019

вы можете использовать

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
id | product     | description                                       
-: | :---------- | :-------------------------------------------------
 1 | truck_space | {"wheels":4,"seats":3,"fuel":"diesel","mileage":8}

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...