【问题标题】:Mysql Query Refactor CaseMysql查询重构案例
【发布时间】:2022-01-11 10:31:41
【问题描述】:

这是我的表结构。 (MariaDB 或 MySql)

id data
1 {"one":"1","two":"3"}
2 {"one":"2","two":"4"}

我想得到这样的输出

id One Two
1 Good Bad
2 More Good Very Bad
Values
1 = Good
2 = More Good
3 = Bad
4 = Very Bad

这是我在 MySQL 中的错误查询

SET @ONE = 'Good';
SET @TWO = 'More Good';
SET @THREE = 'Bad';
SET @FOUR = 'Very Bad';

SELECT id,

CASE
    WHEN REPLACE(json_extract(data, '$.one'), '"', '') = 1 THEN @ONE
    WHEN REPLACE(json_extract(data, '$.one'), '"', '') = 2 THEN @TWO
    WHEN REPLACE(json_extract(data, '$.one'), '"', '') = 3 THEN @THREE
    WHEN REPLACE(json_extract(data, '$.one'), '"', '') = 4 THEN @FOUR
    ELSE 'NO'
END as One,

CASE
    WHEN REPLACE(json_extract(data, '$.two'), '"', '') = 1 THEN @ONE
    WHEN REPLACE(json_extract(data, '$.two'), '"', '') = 2 THEN @TWO
    WHEN REPLACE(json_extract(data, '$.two'), '"', '') = 3 THEN @THREE
    WHEN REPLACE(json_extract(data, '$.two'), '"', '') = 4 THEN @FOUR
    ELSE 'NO'
END as Two
From TableName;

【问题讨论】:

  • MySQL 还是 mariaDB?现在有很多不同了!
  • 什么是精确 DBMS版本?

标签: mysql mariadb refactoring


【解决方案1】:

您可以使用字符串函数,例如 CONCAT_WS() 来创建所有字符串变量的逗号分隔列表,并使用 SUBSTRING_INDEX() 来选择正确的值:

SET @ONE = 'Good';
SET @TWO = 'More Good';
SET @THREE = 'Bad';
SET @FOUR = 'Very Bad';

SELECT id,
       SUBSTRING_INDEX(SUBSTRING_INDEX(
         CONCAT_WS(',', @ONE, @TWO, @THREE, @FOUR),
         ',',
         json_extract(data, '$.one')
       ), ',', -1) One,
       SUBSTRING_INDEX(SUBSTRING_INDEX(
         CONCAT_WS(',', @ONE, @TWO, @THREE, @FOUR),
         ',',
         json_extract(data, '$.two')
       ), ',', -1) Two
FROM tablename;

请参阅demo。

【讨论】:

    【解决方案2】:
    WITH
    dictionary AS ( SELECT 1 id, 'Good' val  UNION ALL
                    SELECT 2,    'More Good' UNION ALL
                    SELECT 3,    'Bad'       UNION ALL
                    SELECT 4,    'Very Bad'  ) 
    SELECT test.id, dict_1.val One, dict_2.val Two
    FROM test
    JOIN dictionary dict_1 ON JSON_EXTRACT(test.data, '$.one') + 0 = dict_1.id
    JOIN dictionary dict_2 ON JSON_EXTRACT(test.data, '$.two') + 0 = dict_2.id
    

    https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=4e7cee70ca62f4c19936bc2896d1791e

    PS。将“我想得到这样的输出”保存到单独的字典表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2013-01-24
      相关资源
      最近更新 更多