当前位置: 首页 > 知识库问答 >
问题:

仅基于特定分隔符拆分字符串

韩乐湛
2023-03-14

我正在尝试拆分字段(在某个分隔符“;”)并将结果插入表中。最大值为5个子字符串,由“;”分隔。最多只有5个水果。如果只有水果列,如何拆分字符串以获得单独的水果。如果果数少于5,其余列将返回NA。

我首先创建了新列并将其全部设置为null。我尝试了以下代码,但它不起作用,如果水果比列少,其余列将只取最后一个水果的值而不是null。

SELECT  
fruits,
  SUBSTRING_INDEX(fruits, ';', 1) AS 'fruit1',
  CASE 
    WHEN LOCATE(';', fruits, LENGTH(fruit1)+1) = 0 THEN NULL 
    ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(fruits, ';', 2), ';', -1)
  END AS 'fruit2',
  CASE 
    WHEN LOCATE(';', fruits, LENGTH(fruit1)+LENGTH(fruit2)+1) = 0 THEN NULL 
    WHEN LOCATE(';', fruits, (LOCATE(';', fruits, LENGTH(fruit1)) + 2)) = 0 THEN NULL
    ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(fruits, ';', 3), ';', -1)
  END AS 'fruit3',
  CASE 
    WHEN LOCATE(';', fruits, LENGTH(fruit1) + LENGTH(fruit2) + LENGTH(fruit3) + 3) = 0 THEN NULL 
    WHEN LOCATE(';', fruits, (LOCATE(';', fruits,  LENGTH(fruit1) + LENGTH(fruit2) + LENGTH(fruit3)+2) + 1)) = 0 THEN NULL
    ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(fruits, ';', 4), ';', -1)
  END AS 'fruit4'
  FROM TABLENAME;

是否还有其他信息可用于拆分字符串?

共有1个答案

许曦
2023-03-14

在MySQL 5.7和8.0中,现在支持JSON函数。您可以执行一些字符串操作来实现以下目的:

apple; orange; banana

进入这个:

["apple", "orange", "banana"]

然后使用JSON函数按位置提取特定的数组元素。

mysql> set @s = 'apple; orange; banana';

mysql> select cast(concat('["', replace(@s, '; ', '","'), '"]') as json) as array;
+-------------------------------+
| array                         |
+-------------------------------+
| ["apple", "orange", "banana"] |
+-------------------------------+


mysql> select json_unquote(json_extract(
    cast(concat('["', replace(@s, '; ', '","'), '"]') as json),
    '$[1]')) as element;
+---------+
| element |
+---------+
| orange  |
+---------+

然后您可以提取'$[2]''$[3]'或任何其他元素。您可以使用-

SELECT  
  fruits,
  fruits->>'$[0]' AS `fruit1`,
  fruits->>'$[1]' AS `fruit2`,
  fruits->>'$[2]' AS `fruit3`,
  fruits->>'$[3]' AS `fruit4`
FROM (
  SELECT CAST(CONCAT('["', REPLACE(fruits, '; ', '","'), '"]')) AS fruits
  FROM TABLENAME
) AS f;

您可以考虑将列表存储为JSON列,而不是当前分号分隔的字符串格式。

 类似资料:
  • 我是 Perl 的新手,但根据我阅读的文档,看起来 Perl 中的 split 函数要求正则表达式模式而不是字符串分隔符作为第一个参数,但我发现使用 之类的东西仍然可以正确拆分字符串。 基于此,我尝试使用可变分隔符(例如。< code>print (split($var,$ string))[0] where < code > $ var = ' ' )并发现它不起作用。我做错了什么? 谢谢! 编

  • 下面是DB2中名为“Person\u Info”的varchar列。我需要使用“\u0”拆分its值,并在DB2中获取第三个标记。然后将其转换为整数。 输出应为: 我已经检查了这篇文章如何在DB2中根据分隔符拆分字符串值。它并没有真正解决这种特殊情况。 我们还检查了这篇文章,它在DB2中拆分了一个VARCHAR来检索其中的值,但它需要创建一个存储过程。我不能在生产环境中为一些实用功能创建一个存储过

  • 如何将过滤器列表拆分为单个过滤器元件?split2String在线程“main”java.util.regex中导致:异常。PatternSyntaxException:索引10或(|和)附近的未闭合组(

  • 我有一个输入字符串,其中包含由分隔符(| |)分隔的4个ID。我使用的代码如下: 但有些情况下并非所有ID都存在,如: 在上面的场景中,拆分不会分为4个部分,并且无法判断拆分数组中缺少哪个id。 有人可以帮助一个有效的解决方案。

  • 我希望能够根据子字符串分隔符拆分字符串,在分隔符子字符串的第一个字符之前开始拆分。现在: 将给我,但我希望得到

  • 我有一个来自服务器的响应。需要使用分隔符“=”分割响应,但对于其中一个参数,其值中也需要包含“=”。示例:响应:Name=Hi 一旦我得到这个响应,我就用 我尝试了不同的包含先行分隔符正则表达式的方法,但都不起作用。