我需要在由-
(破折号)分隔的单元格中拆分数据并放入单独的列中。我遇到的问题是可能有多个-
。
因此,使用下表和来自sic_orig
的原始数据,我需要将所有内容放在-
中的第一个sic_num
之前以及第一个-
之后的所有内容中sic_desc
。我确信这很容易,但我似乎无法找到任何明确的信息。
这是我的表格应该是sic_orig
作为来源,sic_num
和sic_desc
从sic_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);
如何在第一个-
之前和之后的所有内容-
之前拆分所有内容?
答案 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语句测试我的表达式。