MySql字符串拆分实现split功能(字段分割转列)
在 MySql 中,没有类似 Python 中的 split 函数,可以方便地将字符串分割,但可以用以下方法实现类似 split 的功能,即将字符串拆分并分成多个字段。
步骤
- 创建一个数字表,用于生成序列号,数字表的个数可以根据要拆分字符串的最大长度来决定。
mysql
CREATE TABLE seq_1000(seq int);
INSERT INTO seq_1000 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),
(21),(22),(23),(24),(25),(26),(27),(28),(29),(30),
(31),(32),(33),(34),(35),(36),(37),(38),(39),(40),
(41),(42),(43),(44),(45),(46),(47),(48),(49),(50),
(51),(52),(53),(54),(55),(56),(57),(58),(59),(60),
(61),(62),(63),(64),(65),(66),(67),(68),(69),(70),
(71),(72),(73),(74),(75),(76),(77),(78),(79),(80),
(81),(82),(83),(84),(85),(86),(87),(88),(89),(90),
(91),(92),(93),(94),(95),(96),(97),(98),(99),(100),
(101),(102),(103),(104),(105),(106),(107),(108),(109),(110),
(111),(112),(113),(114),(115),(116),(117),(118),(119),(120),
(121),(122),(123),(124),(125),(126),(127),(128),(129),(130),
(131),(132),(133),(134),(135),(136),(137),(138),(139),(140),
(141),(142),(143),(144),(145),(146),(147),(148),(149),(150),
(151),(152),(153),(154),(155),(156),(157),(158),(159),(160),
(161),(162),(163),(164),(165),(166),(167),(168),(169),(170),
(171),(172),(173),(174),(175),(176),(177),(178),(179),(180),
(181),(182),(183),(184),(185),(186),(187),(188),(189),(190),
(191),(192),(193),(194),(195),(196),(197),(198),(199),(200),
(201),(202),(203),(204),(205),(206),(207),(208),(209),(210),
(211),(212),(213),(214),(215),(216),(217),(218),(219),(220),
(221),(222),(223),(224),(225),(226),(227),(228),(229),(230),
(231),(232),(233),(234),(235),(236),(237),(238),(239),(240),
(241),(242),(243),(244),(245),(246),(247),(248),(249),(250),
(251),(252),(253),(254),(255),(256),(257),(258),(259),(260),
(261),(262),(263),(264),(265),(266),(267),(268),(269),(270),
(271),(272),(273),(274),(275),(276),(277),(278),(279),(280),
(281),(282),(283),(284),(285),(286),(287),(288),(289),(290),
(291),(292),(293),(294),(295),(296),(297),(298),(299),(300),
(301),(302),(303),(304),(305),(306),(307),(308),(309),(310),
(311),(312),(313),(314),(315),(316),(317),(318),(319),(320),
(321),(322),(323),(324),(325),(326),(327),(328),(329),(330),
(331),(332),(333),(334),(335),(336),(337),(338),(339),(340),
(341),(342),(343),(344),(345),(346),(347),(348),(349),(350),
(351),(352),(353),(354),(355),(356),(357),(358),(359),(360),
(361),(362),(363),(364),(365),(366),(367),(368),(369),(370),
(371),(372),(373),(374),(375),(376),(377),(378),(379),(380),
(381),(382),(383),(384),(385),(386),(387),(388),(389),(390),
(391),(392),(393),(394),(395),(396),(397),(398),(399),(400),
(401),(402),(403),(404),(405),(406),(407),(408),(409),(410),
(411),(412),(413),(414),(415),(416),(417),(418),(419),(420),
(421),(422),(423),(424),(425),(426),(427),(428),(429),(430),
(431),(432),(433),(434),(435),(436),(437),(438),(439),(440),
(441),(442),(443),(444),(445),(446),(447),(448),(449),(450),
(451),(452),(453),(454),(455),(456),(457),(458),(459),(460),
(461),(462),(463),(464),(465),(466),(467),(468),(469),(470),
(471),(472),(473),(474),(475),(476),(477),(478),(479),(480),
(481),(482),(483),(484),(485),(486),(487),(488),(489),(490),
(491),(492),(493),(494),(495),(496),(497),(498),(499),(500),
(501),(502),(503),(504),(505),(506),(507),(508),(509),(510),
(511),(512),(513),(514),(515),(516),(517),(518),(519),(520),
(521),(522),(523),(524),(525),(526),(527),(528),(529),(530),
(531),(532),(533),(534),(535),(536),(537),(538),(539),(540),
(541),(542),(543),(544),(545),(546),(547),(548),(549),(550),
(551),(552),(553),(554),(555),(556),(557),(558),(559),(560),
(561),(562),(563),(564),(565),(566),(567),(568),(569),(570),
(571),(572),(573),(574),(575),(576),(577),(578),(579),(580),
(581),(582),(583),(584),(585),(586),(587),(588),(589),(590),
(591),(592),(593),(594),(595),(596),(597),(598),(599),(600),
(601),(602),(603),(604),(605),(606),(607),(608),(609),(610),
(611),(612),(613),(614),(615),(616),(617),(618),(619),(620),
(621),(622),(623),(624),(625),(626),(627),(628),(629),(630),
(631),(632),(633),(634),(635),(636),(637),(638),(639),(640),
(641),(642),(643),(644),(645),(646),(647),(648),(649),(650),
(651),(652),(653),(654),(655),(656),(657),(658),(659),(660),
(661),(662),(663),(664),(665),(666),(667),(668),(669),(670),
(671),(672),(673),(674),(675),(676),(677),(678),(679),(680),
(681),(682),(683),(684),(685),(686),(687),(688),(689),(690),
(691),(692),(693),(694),(695),(696),(697),(698),(699),(700),
(701),(702),(703),(704),(705),(706),(707),(708),(709),(710),
(711),(712),(713),(714),(715),(716),(717),(718),(719),(720),
(721),(722),(723),(724),(725),(726),(727),(728),(729),(730),
(731),(732),(733),(734),(735),(736),(737),(738),(739),(740),
(741),(742),(743),(744),(745),(746),(747),(748),(749),(750),
(751),(752),(753),(754),(755),(756),(757),(758),(759),(760),
(761),(762),(763),(764),(765),(766),(767),(768),(769),(770),
(771),(772),(773),(774),(775),(776),(777),(778),(779),(780),
(781),(782),(783),(784),(785),(786),(787),(788),(789),(790),
(791),(792),(793),(794),(795),(796),(797),(798),(799),(800),
(801),(802),(803),(804),(805),(806),(807),(808),(809),(810),
(811),(812),(813),(814),(815),(816),(817),(818),(819),(820),
(821),(822),(823),(824),(825),(826),(827),(828),(829),(830),
(831),(832),(833),(834),(835),(836),(837),(838),(839),(840),
(841),(842),(843),(844),(845),(846),(847),(848),(849),(850),
(851),(852),(853),(854),(855),(856),(857),(858),(859),(860),
(861),(862),(863),(864),(865),(866),(867),(868),(869),(870),
(871),(872),(873),(874),(875),(876),(877),(878),(879),(880),
(881),(882),(883),(884),(885),(886),(887),(888),(889),(890),
(891),(892),(893),(894),(895),(896),(897),(898),(899),(900),
(901),(902),(903),(904),(905),(906),(907),(908),(909),(910),
(911),(912),(913),(914),(915),(916),(917),(918),(919),(920),
(921),(922),(923),(924),(925),(926),(927),(928),(929),(930),
(931),(932),(933),(934),(935),(936),(937),(938),(939),(940),
(941),(942),(943),(944),(945),(946),(947),(948),(949),(950),
(951),(952),(953),(954),(955),(956),(957),(958),(959),(960),
(961),(962),(963),(964),(965),(966),(967),(968),(969),(970),
(971),(972),(973),(974),(975),(976),(977),(978),(979),(980),
(981),(982),(983),(984),(985),(986),(987),(988),(989),(990),
(991),(992),(993),(994),(995),(996),(997),(998),(999),(1000);
- 使用字符串函数
SUBSTRING_INDEX
将字符串拆分成多个字段,然后使用连接和同步上面数字表的方式,将字段分装成多行数据返回。
```mysql
DROP FUNCTION IF EXISTS split;
DELIMITER //
CREATE FUNCTION split(str text, delim VARCHAR(12), pos INT) RETURNS VARCHAR(256)
BEGIN
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1), delim, '');
END//
DELIMITER ;
-- 测试
SELECT split('hello:world:ing', ':', 1) AS string1
,
split('hello:world:ing', ':', 2) AS string2
,
split('hello:world:ing', ':', 3) AS string3
;
-- Output:
-- string1 | string2 | string3
-- hello | world | ing
```
- 通过连接多条 sql 语句的方式将多个字段拼接成多列。
mysql
-- 测试
SELECT
split('Tom, 12, 150', ',', 1) AS `name`,
split('Tom, 12, 150', ',', 2) AS `age`,
split('Tom, 12, 150', ',', 3) AS `height`;
-- Output:
-- name | age | height
-- Tom | 12 | 150
示例
在下面的示例中,将一些美国街道地址字符串拆分成单独的列:街、城市、州、邮编。这个示例中,我们需要用空格字符来拆分字符串。我们可以使用 SPLIT()
函数,同样需要退出数字表。
CREATE TABLE usa_address(
address text
);
INSERT INTO usa_address VALUES
('92866 Campus Drive, Irvine, California 92697'),
('210 E Trade Street Charlotte, NC 28202'),
('1160 Broadway St, Chico, CA 95928');
DROP FUNCTION IF EXISTS split;
DELIMITER //
CREATE FUNCTION split(str txt, delim VARCHAR(12), pos INT) RETURNS VARCHAR(256)
BEGIN
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
LENGTH(SUBSTRING_INDEX(str, delim, pos - 1)) + 1), delim, '');
END//
DELIMITER ;
SELECT
split(address, ' ', 1) AS `street`,
split(address, ' ', 2) AS `city`,
split(address, ' ', 3) AS `state`,
split(address, ' ', -1) AS `zip code`
FROM usa_address;
-- Output:
-- street | city | state | zip code
-- 92866 | Campus Drive| Irvine, | 92697
-- 210 | E Trade | Street | 28202
-- 1160 | Broadway St | Chico, | 95928
总结
使用字符串函数和 数字表 可以在 MySQL 中实现类似 split 字符串拆分功能,并将其转换为多列数据,这种方法可以应用于多个场景,比如将某些数据拆分成个别信息,环节之间的表单数据拆分等。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySql字符串拆分实现split功能(字段分割转列) - Python技术站