如何使用 MySQL 拆分每个有空格的数据或字符串?

Vin*_*nce 0 mysql sql database

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

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;
Run Code Online (Sandbox Code Playgroud)

我得到了这样的结果

在此处输入图片说明

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

Nic*_*ick 5

由于您使用的是 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
Run Code Online (Sandbox Code Playgroud)

(部分)样本数据的输出

Original        First_code  Second_code     Third_code
NS23            NS23        
NS24 NE6 CC1    NS24        NE6             CC1
NS25 EW13       NS25        EW13    
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

dbfiddle 上的演示