首页 > 解决方案 > 如何使用 MySQL 拆分每个有空格的数据或字符串?

问题描述

我写了一个查询是这样的:

SELECT mrt_name as MRT ,
operation_alpha_numeric_codes as Original,
SUBSTRING_INDEX(operation_alpha_numeric_codes,' ', 1) as First_code,
SUBSTRING_INDEX(operation_alpha_numeric_codes,' ', -1) as Second_Code,
SUBSTRING_INDEX(operation_alpha_numeric_codes,' ', -2) as Third_Code 
FROM scraping.xp_pn_mrt;

我得到了这样的结果

在此处输入图像描述

如您所见,如果该值没有相应的空格或数据,则second_code复制该值original或该值。first_code此外,third代码会获取其中second_code包含第三个代码的记录。当代码中没有相应的值时,如何防止数据被复制或将其设置为空白?如何在不复制第二个代码的情况下获得第三个代码?有人可以帮我解决我的问题吗?有什么问题吗?非常感谢。

标签: mysqlsqldatabase

解决方案


由于您使用的是 MariaDB,因此您可以使用它REGEXP_REPLACE来提取您想要的代码部分:

SELECT 
  operation_alpha_numeric_codes as Original,
  REGEXP_REPLACE(operation_alpha_numeric_codes, '^([^ ]+)(?: ([^ ]+))?(?: ([^ ]+))?$', '\\1') as First_code,
  REGEXP_REPLACE(operation_alpha_numeric_codes, '^([^ ]+)(?: ([^ ]+))?(?: ([^ ]+))?$', '\\2') as Second_code,
  REGEXP_REPLACE(operation_alpha_numeric_codes, '^([^ ]+)(?: ([^ ]+))?(?: ([^ ]+))?$', '\\3') as Third_code
FROM data

(部分)样本数据的输出

Original        First_code  Second_code     Third_code
NS23            NS23        
NS24 NE6 CC1    NS24        NE6             CC1
NS25 EW13       NS25        EW13    

dbfiddle 上的演示

这是一个也适用于 MySQL 5.7 的版本,RLIKE用于检查输入是否与给定的模式匹配:

SELECT 
  operation_alpha_numeric_codes as Original,
  SUBSTRING_INDEX(operation_alpha_numeric_codes, ' ', 1) AS First_code,
  CASE WHEN operation_alpha_numeric_codes RLIKE '^([^ ]+)$' THEN ''
       WHEN operation_alpha_numeric_codes RLIKE '^([^ ]+)( ([^ ]+))?$' THEN SUBSTRING_INDEX(operation_alpha_numeric_codes, ' ', -1)
       ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(operation_alpha_numeric_codes, ' ', 2), ' ', -1)
  END AS Second_code,
  CASE WHEN operation_alpha_numeric_codes RLIKE '^([^ ]+)( ([^ ]+)){2}$' THEN SUBSTRING_INDEX(operation_alpha_numeric_codes, ' ', -1)
       ELSE ''
  END AS Third_code
FROM data

dbfiddle 上的演示


推荐阅读