【问题标题】:Creating new data table on existing one在现有数据表上创建新数据表
【发布时间】:2021-05-16 02:47:49
【问题描述】:

您好,我有一个问题,我如何(如果可能的话)创建具有相同行的新数据表,但如果列中的值在字符串“/”中,例如

ID column_param column_sym column_value column_val2
First param_test1 ABC 11/12 test
Second param_test2 CDE 22/11 test
Third param_test3 EFG 44 teste
4'th param_test4 HIJ 33/22 test

如果我有 param_test1param_test4 并且如果在此列中的值有“/”,我想创建另外 2 行但如果我不设置 param_test2 那么它保持原样,一切都应该在新的数据表中。有什么方法可以创建这个吗? 提前谢谢你。

预期结果:

【问题讨论】:

  • 在翻译中丢失了很多内容..请您添加您的预期结果,
  • 好的,我编辑了预期结果的帖子
  • param_test1param_test4 行是否有可能根据column_value (1) 而没有/? (2) 有多个/? (3) 等份(例如'12/12')?
  • 是的,有可能,不是每个 param_test1 都有“/”,有时有超过 (1) 个“/”
  • 什么是精确 MySQL版本?

标签: mysql sql database datatable


【解决方案1】:

我不知道id 是如何设置的,但你可以使用union all 做你想做的事:

select column_param, column_sym,
       substring_index(column_value, '/', 1) as column_value,
       column_val2
from t
union all
select column_param, column_sym,
       substring_index(column_value, '/', -1) as column_value,
       column_val2
from t
where column_value = '%/%';

【讨论】:

    【解决方案2】:
    • 根据 Gordon 的回答,我不确定应该如何处理您的 ID 列。 我已将这些替换为行号。
    • 根据您的 MySQL/MariaDB 版本,ROW_NUMBER() 窗口函数可能不可用。根据输出中的 ID 是否必要,您可以简单地省略它。
    • 我假设存在一个名为 myNumbers 的表,其中包含一个字段 num,并填充了从 1 到您可能需要的任何正整数。

    我在您要求的输出中包含了更多内容,希望能帮助您了解发生了什么

    SELECT
        ROW_NUMBER() OVER (ORDER BY d.ID, n.num) as NewID,
        d.ID as OriginalID,
        n.num as,
        d.column_param,
        d.column_sym,
        d.column_value as orig_value,
        CASE WHEN column_param = 'param_test2' THEN d.column_value
        ELSE substring_index(substring_index(d.column_value,'/',n.num),'/',-1) END as split_value,
        d.column_val2
    FROM
        myData d
        JOIN myNumbers n on char_length(d.column_value)-char_length(replace(d.column_value,'/','')) >= n.num-1
    WHERE
        n.num = 1 OR d.column_param <> 'param_test2'
    ORDER BY
        d.ID,
        n.num
    

    查看DB Fiddle(列输出的顺序与我指定的不同,但我认为这是 DB Fiddle 的怪癖)。

    如果你只想“拆分”param_test1param_test4 行,上面的代码可以修改如下:

    SELECT
        ROW_NUMBER() OVER (ORDER BY d.ID, n.num) as NewID,
        d.ID as OriginalID,
        d.column_param,
        d.column_sym,
        n.num,
        d.column_value as orig_value,
        CASE WHEN column_param NOT IN ('param_test1','param_test4') THEN d.column_value
        ELSE substring_index(substring_index(d.column_value,'/',n.num),'/',-1) END as split_value,
        d.column_val2
    FROM
        myData d
        JOIN myNumbers n on char_length(d.column_value)-char_length(replace(d.column_value,'/','')) >= n.num-1
    WHERE
        n.num = 1 OR d.column_param  IN ('param_test1','param_test4')
    ORDER BY
        d.ID,
        n.num
    

    【讨论】:

    • ID 只是一个数字,我不会对 ID 做任何思考。我会检查你的答案:)
    • 还有一个问题是可以将“param_test2”更改为仅“param_test1 和 param_test4”并稍微反转这个查询,因为像“param_test1”这样的参数我有一些,但是像“ param_test2" 我有数千个,我只想用 "param_test1" 或 "param_test4" 之类的参数来划分行
    • 是的,如果您只有几个不同的 column_param 值需要拆分,而许多不需要拆分,那将是有意义的。我会尽快发布一个调整后的版本。
    • 很好,非常感谢,我会测试一下。我希望它会起作用:)它会挽救我的生命:D
    • 如果它有效,然后回来投票并接受答案,以帮助其他人找到有用的东西。如果它不起作用,请相应地发表评论,我们会看看我们是否可以修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2022-06-16
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多