如何在使用MySQL之后拆分所有内容 - (破折号)

时间:2016-09-19 20:27:42

标签: mysql sql split

我需要在由-(破折号)分隔的单元格中拆分数据并放入单独的列中。我遇到的问题是可能有多个-

因此,使用下表和来自sic_orig的原始数据,我需要将所有内容放在-中的第一个sic_num之前以及第一个-之后的所有内容中sic_desc。我确信这很容易,但我似乎无法找到任何明确的信息。



这是我的表格应该是sic_orig作为来源,sic_numsic_descsic_orig获取数据的情况:

              sic_orig                |  sic_num  |        sic_desc
---------------------------------------------------------------------------
  509406 - Jewelers-Wholesale         |   509406  |  Jewelers-Wholesale
--------------------------------------|-----------|------------------------
  506324 - Burglar Alarm Systems      |   506324  |  Burglar Alarm Systems
--------------------------------------|-----------|------------------------
  502317 - Picture Frames-Wholesale   |   502317  |  Picture Frames-Wholesale



此代码有效,但仅在有两个-并且某些单元格可能包含1,2或3 -

的情况下才有效
 UPDATE test_tbl_1 
    SET sic_num = SUBSTRING_INDEX(`sic_orig`, '-', 1),
        sic_desc = SUBSTRING_INDEX(`sic_orig`, '-', -2);



如何在第一个-之前和之后的所有内容-之前拆分所有内容?

3 个答案:

答案 0 :(得分:2)

一种方法是使用第一部分的长度并将其用于substr()

UPDATE test_tbl_1 
    SET sic_num = SUBSTRING_INDEX(`sic_og`, '-', 1),
        sic_desc = SUBSTR(sig_og, CHAR_LENGTH(SUBSTRING_INDEX(`sic_og`, '-', 1)) + 1) ;

答案 1 :(得分:1)

您可以结合使用SUBSTR()和LOCATE()函数来帮助您对字符串进行切片:

UPDATE test_tbl_1 
SET sic_num  = SUBSTR(sig_orig, 1, LOCATE('-', sig_orig) - 1),
    sic_desc = SUBSTR(sig_orig, LOCATE('-', sig_orig) +  1) ;

单击here获取MySQL字符串函数。

答案 2 :(得分:1)

另一种方法是获取字符串中破折号的计数。我们可以通过用空字符串替换所有短划线字符,然后从原始字符串的长度中减去长度来计算短划线字符的数量。

作为示范:

 SELECT `sic_orig`
      , CHAR_LENGTH(`sic_orig`)-CHAR_LENGTH(REPLACE(`sic_orig`,'-','')) AS cnt_dashes
   FROM ( SELECT  '509406 - Jewelers-Wholesale ' AS sic_orig
          UNION ALL SELECT '506324 - Burglar Alarm Systems'
          UNION ALL SELECT '502317 - Picture Frames-Wholesale'
          UNION ALL SELECT ' la di dah no dashes '
        ) t

返回:

sic_orig                               cnt_dashes  
-------------------------------------  ----------
509406 - Jewelers-Wholesale                     2
506324 - Burglar Alarm Systems                  1
502317 - Picture Frames-Wholesale               2
lots-of - -dashes- --everywhere-- --           10
 zero dashes                                    0

我们可以使用返回短划线计数的表达式作为SUBSTRING_INDEX的第三个参数,乘以负数1得到一个负值......

 SELECT `sic_orig`
      , TRIM(
          SUBSTRING_INDEX(`sic_orig`,'-'
          , 1
          )
        ) AS before_first_dash
      , TRIM(
          SUBSTRING_INDEX(`sic_orig`,'-'
          , -1*(CHAR_LENGTH(`sic_orig`)-CHAR_LENGTH(REPLACE(`sic_orig`,'-','')))
          )
        ) AS after_first_dash
   FROM ( SELECT '509406 - Jewelers-Wholesale ' AS sic_orig
          UNION ALL SELECT '506324 - Burglar Alarm Systems'
          UNION ALL SELECT '502317 - Picture Frames-Wholesale'
          UNION ALL SELECT 'lots-of - -dashes- - -every-where-'
          UNION ALL SELECT ' zero dashes '
        ) t

返回:

sic_orig                            before_first_dash  after_first_dash          
---------------------------------   -----------------  ----------------------
509406 - Jewelers-Wholesale         509406             Jewelers-Wholesale
506324 - Burglar Alarm Systems      506324             Burglar Alarm Systems
502317 - Picture Frames-Wholesale   502317             Picture Frames-Wholesale
lots-of - -dashes- - -every-where-  lots               of - -dashes- - -every-where- 
 zero dashes                        zero dashes

额外的换行符和格式化旨在使表达式更容易解密,确保parens平衡等。

在将这些表达式放入UPDATE语句之前,我总是首先用SELECT语句测试我的表达式。