MySQL - разделенные правый и левый значения с разделителями - PullRequest
0 голосов
/ 09 марта 2019

У меня есть случай, когда я получу ввод для продуктов и их значений, разделенных специальным символом с разделителями.Используя эту строку, мне нужно разделить продукты и их значения в строках MySQL, как показано ниже.

Ввод:

{"1301":29.00,"1302":25.01,"1306":50.09,"1678":100.00}

Вывод:

Product ID      Value
1301             29.00
1302             25.01
1306             50.09
1678             100.00

Здесь Id продуктов имеет значениеявляются динамическими, мы можем получить n счет каждый раз.Пожалуйста, помогите мне получить вышеуказанный вывод в MySQL.

Ответы [ 2 ]

1 голос
/ 09 марта 2019

MySQL только решение с функциями JSON.

Запрос

 SELECT 
  TRIM(REPLACE(
    SUBSTRING_INDEX(
       SUBSTRING_INDEX(json_parsed, ',', number_generator.number)
       , ','
       , -1
     )
     , '"'
     , ''
   ))  AS 'Product ID'
 , JSON_EXTRACT(json, CONCAT('$.', SUBSTRING_INDEX(
     SUBSTRING_INDEX(json_parsed, ',', number_generator.number)
     , ','
     , -1
   ))) AS 'Value'
FROM (

  SELECT 
   @row := @row + 1 AS number
  FROM (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION   SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row1
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION  SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row2
  CROSS JOIN (
    SELECT @row := 0 
  ) init_user_params 
) AS number_generator
CROSS JOIN (

    SELECT  
        SUBSTRING(json_keys, 2, json_keys_length - 2) AS json_parsed
      , json_keys
      , json
      , JSON_LENGTH(json_keys) AS json_array_length                       
    FROM (
       SELECT 
            JSON_KEYS(record.json) AS json_keys
          , json
          , LENGTH(JSON_KEYS(record.json)) AS json_keys_length
       FROM (
          SELECT 
             '{"1301":29.00,"1302":25.01,"1306":50.09,"1678":100.00}' AS json
          FROM  
            DUAL  
       ) AS record                     
    ) AS json_information  
  ) AS json_init
WHERE
 number_generator.number BETWEEN 0 AND json_array_length

Результат

| Product ID | Value |
| ---------- | ----- |
| 1301       | 29.0  |
| 1302       | 25.01 |
| 1306       | 50.09 |
| 1678       | 100.0 |

см. демо

1 голос
/ 09 марта 2019

Вы действительно должны относиться к этому как к JSON, но вы можете использовать строковые методы грубой силы.Вот один из методов:

select replace(substring_index(str, ':', 1), '"', '') as product_id, substring_index(str, ':', -1) as value
from (select replace(replace(substring_index(@x, ',', 1), '{', ''), '}', '') as str) x
union all
select replace(substring_index(str, ':', 1), '"', '') as product_id, substring_index(str, ':', -1) as value
from (select replace(replace(substring_index(substring_index(@x, ',', 2), ',', -1), '{', ''), '}', '') as str) x
union all
select replace(substring_index(str, ':', 1), '"', '') as product_id, substring_index(str, ':', -1) as value
from (select replace(replace(substring_index(substring_index(@x, ',', 3), ',', -1), '{', ''), '}', '') as str) x
union all
select replace(substring_index(str, ':', 1), '"', '') as product_id, substring_index(str, ':', -1) as value
from (select replace(replace(substring_index(substring_index(@x, ',', 4), ',', -1), '{', ''), '}', '') as str) x;

вместе с db <> скрипкой .

...