【问题标题】:MySQL - Query to move part of 1 field's contents to a new fieldMySQL - 查询将 1 个字段的部分内容移动到新字段
【发布时间】:2010-12-10 15:21:53
【问题描述】:

我有一个名为 cartypes 的表,它目前有 2 个字段:id 和 type。我正在添加子类型,我想将破折号- 之后的内容从名为 type 的字段中移动,并将这些内容放入子类型中。处理破折号(任何额外的空白也是如此)。对此最好的 SQL 查询是什么?

之前:

id        type                                      subtype (currently empty)
------------------------------------------------------------------------------
1     legendary muscle car  - steel          
2     crappy sedan - plasticky interior
3     legendary sports car  - aluminum bodywork
4     compact car

之后:

id        type                     subtype
---------------------------------------------------------------
1     legendary muscle car        steel          
2     crappy sedan                plasticky interior
3     legendary sports car        aluminum bodywork
4     compact car

【问题讨论】:

    标签: mysql regex replace


    【解决方案1】:
    UPDATE table
     SET subtype = TRIM(SUBSTRING(type, LOCATE('-', type) + 1)),
         type = TRIM(SUBSTRING(type, 1, LOCATE('-', type) - 1))
     WHERE type LIKE '%-%';
    

    【讨论】:

    • 谢谢基思,我试过了,很接近。我认为我遇到的问题是您在 SET 子类型之前将类型设置为它的新值。所以子类型变成了NULL。
    • 所以我只是交换了 2 个 SET,首先设置 subtype 并且有效,但是 type 的值现在以破折号结尾。例如:蹩脚的轿车-
    • 没什么大不了的,只是搜索并替换了“\ -”(反斜杠空格破折号),然后什么都没有替换。都好。谢谢!
    • 一个错误。索引从 1 开始的愚蠢 sql...您只需要 LOCATE('-', type) - 1 作为第一个 SUBSTRING 中的参数(或重新排序后,第二个)。
    【解决方案2】:

    这是一个更新语句,涉及两个 SUBSTR()(每个新列一个)和原始列上的字符串 LOCATE()。我并没有真正使用 MySQL,但是这个技巧无处不在,只是字符串查找例程的语法发生了变化。

    【讨论】:

    • 这是一个类似类型问题的链接,带有一些语法:stackoverflow.com/questions/993205/mysql-substring
    • 嗯,那么我需要在循环选择时进行更新,如下所示? SELECT CASE WHEN LOCATE('-',type) = 0 THEN '' ELSE SUBSTRING(type,LOCATE('-',type)+1) END as subtype FROM cards 但这仍然会在 orig 类型中留下现在不需要的东西科尔,不是吗?
    猜你喜欢
    • 2011-03-20
    • 2020-12-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2013-08-01
    • 2019-01-19
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多