2017-01-19 56 views
1

我有一个包含带变量长度的说明的varchar字段的表。我想以下面显示的形式更新它(在第一种情况下删除20161203_之后和LC1001_)之前的部分),如果出现LC的字符串。通过MYSQL在字符串中出现特殊事件时通过部分字符串更新字符串

例如,如果表中包含:

|col1 | 
+-----+ 
|20161512_NL_Luxus_1_DE | 
|20161217_1001_LC_YoBirthdayNo_A_CH | 
|20161512_NL_SDT_4_DE| 
|20170117_2003_LC_YoBirthdayYes_A_DE | 

我想查询将返回:

|result| 
+------+ 
|20161512_NL_Luxus_1_DE| 
|20161217_LC_YoBirthdayNo_A_CH| 
|20161512_NL_SDT_4_DE| 
|20170117_LC_YoBirthdayYes_A_DE | 

我想它想:

UPDATE table1 SET col1 = CASE WHEN col1 LIKE '%LC%' THEN SUBSTRING_INDEX(SUBSTRING_INDEX(col1, '_', 1), '_', 2) 

但that's不正确...

在此先感谢!

+0

'_LC_'是否总是前面有一个四位数字? –

+0

昨天晚上我还在路上 - 现在我的回答是:现在是 - 但后来可能会更长..不管数字的数量是多少? – AbsoluteBeginner

回答

1

我也首先尝试使用SUBSTRING_INDEX来做到这一点,但当它似乎只支持单个字符分隔符时就放弃了。我的后备解决方案只是使用INSTRSUBSTRING的组合。在下面的查询中,我将更新的col1连接在一起,在拼接出您想要删除的四位数字的过程中。

UPDATE table1 
SET col1 = CONCAT(SUBSTRING(col1, 1, 8),     -- keep 8 digit date 
        SUBSTRING(col1, INSTR(col1, '_LC_'))) -- and everything from _LC_ 
WHERE col1 LIKE '%_LC_%'         -- onwards 
+0

看到我上面的提示 - 无论数字的数量如何,您给我的结果是什么? – AbsoluteBeginner

+0

@AbsoluteBeginner不,我原来的答案是假设一个四位数的数字。我更新了假设,你只是想保留8位数字的日期,后面跟着'_LC_ ...'。这避免了必须知道该数字可能有多大的问题。 –

+0

好的:它会在下一个X月份工作 - 直到我的部门决定再次以不同的方式解决问题:我会再次报告时间......首先非常感谢您! – AbsoluteBeginner