MySQL:如何从列的开头或结尾删除与另一列匹配的值?

时间:2015-06-02 22:51:43

标签: mysql

我正在解析存储在Sql表中的电视节目数据,并且该数据有两列,一列用于整个节目标题(例如系列名称),然后一列用于节目的副标题(例如个别剧集)标题)。但是,程序字幕通常也包含其中的系列名称,无论是在字符串的开头还是在结尾处,或者两者都是,以下列格式:

e.g。所以使用“Horizo​​n”标题和“1000万英镑挑战”的正确副标题,以下是字幕字段中值的可能组合:

  • 地平线:1000万英镑的挑战
  • 1000万英镑的挑战:地平线
  • 地平线:1000万英镑的挑战:地平线

而不是冒号后跟空格,分隔符也可以是空格连字符空格,如下所示:“地平线 - 1000万英镑的挑战 - 地平线”

基本上,我想要做的是表格中的每一行,如果字幕包含字幕开头的标题栏中的值(后跟':'或' - '),或者该值是在列的末尾(前面加上':'或' - ')或两者,然后更新该子标题以删除该前缀或后缀。任何人都可以帮助或指出我正确的方向吗?我不确定从哪里开始。

2 个答案:

答案 0 :(得分:0)

为什么要在字幕栏中输入标题名称?

我认为你应该只提取实际名称,然后用它做你想做的事。我认为这需要大量的案例陈述:

update table t
    set subtitle = (case when subtitle like concat(title, ':%', title)
                         then trim(substring_index(substring_index(subtitle, ':', 2), ':', -1)))
                         when subtitle like concat(title, '-%', title)
                         then trim(substring_index(substring_index(subtitle, '-', 2), '-', -1)))
                         when subtitle like concat('%:', title)
                         then trim(substring_index(subtitle, ':', 1))
                         when subtitle like concat('%-', title)
                         then trim(substring_index(subtitle, '-', 2))
                         else subtitle
                   end)

首先在select中对此进行测试。此外,如果字幕的名称中有连字符或冒号,则在某些情况下不会起作用。

答案 1 :(得分:0)

我决定打破修改前缀&后缀为两个单独的查询以使其更容易,以及第三次检查,因为我注意到有时节目标题在字幕前的括号中。这就是我最后使用的内容(后面是从列中修剪任何剩余空格的最终操作)。

UPDATE table
    set subtitle = (case
            when subtitle like concat(title,': %') /*Title: Subtitle*/
            then trim(LEADING concat(title,': ') FROM subtitle)

            when subtitle like concat(title,' - %') /*Title - Subtitle*/
            then trim(LEADING concat(title,' - ') FROM subtitle)

            when subtitle like concat('(',title,') %') /*(Title) Subtitle*/
            then trim(LEADING concat('(',title,') ') FROM subtitle)
            else subtitle end);

UPDATE table
    set subtitle = (case
            when subtitle like concat('%: ',title) /*Subtitle: Title*/
            then trim(TRAILING concat(': ',title) FROM subtitle)

            when subtitle like concat('% - ',title) /*Subtitle - Title*/
            then trim(TRAILING concat(' - ',title) FROM subtitle)

            when subtitle like concat('%(',title,') ') /*Subtitle (Title)*/
            then trim(TRAILING concat('(',title,') ') FROM subtitle)
            else subtitle end);

UPDATE table
    set subtitle = trim(BOTH ' ' FROM subtitle);

感谢@ gordon-lindoff。