SQL - 使用多次出现的“/”拆分字符串

Posted

技术标签:

【中文标题】SQL - 使用多次出现的“/”拆分字符串【英文标题】:SQL - split a string using "/" that occurs multiple times 【发布时间】:2017-09-05 20:37:41 【问题描述】:

我正在寻找 HSQLDB 的查询。

我有一个字符串,其中包含由“/”分隔的地址信息。现在我必须用“/”分割这个字符串,并将单独的地址信息插入单独的列中。

Address =  /1234/CLAREVIEW////WILMINGTON/DE/19702

这需要拆分为

StreetNo = Address[1] = 1234
StreetName = Address[2] = CLAREVIEW
StreetType = Address[3] = 
City = Address[6] = WILMINGTON
StateCd = Address[7] = DE
ZipCd = Address[8] = 19702

我怎样才能做到这一点?

【问题讨论】:

使用 REGEXP_SUBSTRING_ARRAY 函数创建过程以拆分为数组。然后 INSERT INTO t (StreetNo, StreetName, StreetType...) VALUES (arr[1], arr[2], arr[3], ...) @fredt 我从未使用过 REGEXP_SUBSTRING_ARRAY。我搜索但找不到任何有用的东西。请给我一些例子吗 【参考方案1】:

使用 REGEXP_SUBSTRING_ARRAY 函数创建过程以拆分为数组。

 REGEXP_SUBSTRING_ARRAY('/1234/CLAREVIEW////WILMINGTON/DE/19702', '/\pAlnum*');

返回

 ARRAY['/1234','/CLAREVIEW','/','/','/','/WILMINGTON','/DE','/19702'] 

所以程序应该包含:

 CREATE PROCEDURE INSERT_USING_REGEXP (p1 VARCHAR(500)) 
  BEGIN ATOMIC
   DECLARE arr VARCHAR(200) ARRAY;
   SET arr = REGEXP_SUBSTRING_ARRAY(p1,'/\pAlnum*');
   INSERT INTO thetable ((StreetNo, StreetName, StreetType...) VALUES ( arr[1], arr[2], arr[3], ...);
  END;

然后

 CALL INSERT_USING_REGEXP('/1234/CLAREVIEW////WILMINGTON/DE/19702');

【讨论】:

谢谢。这是完美的。 Alnum dint 似乎对我有用。我用 [a-zA-Z0-9] 代替 有没有办法可以扩展正则表达式以包含特殊字符,而不仅仅是数字和字母【参考方案2】:
CREATE TABLE #Results
   (
    Ordinal NUMERIC,
    StringValue VARCHAR(MAX)
   )

DECLARE @String VARCHAR(100),
   @Delimiter VARCHAR(100) 

SET @String = '/1234/CLAREVIEW////WILMINGTON/DE/19702'
SET @Delimiter = '/'

DECLARE @TempString VARCHAR(MAX) = @String,
   @Ordinal INT = 0,
   @CharIndex INT = 0

SET @CharIndex = CHARINDEX(@Delimiter, @TempString)
WHILE @CharIndex != 0
   BEGIN     
      SET @Ordinal += 1       
      INSERT   #Results
      VALUES   (@Ordinal, SUBSTRING(@TempString, 0, @CharIndex))       
      SET @TempString = SUBSTRING(@TempString, @CharIndex + 1, LEN(@TempString) - @CharIndex)     
      SET @CharIndex = CHARINDEX(@Delimiter, @TempString)
   END

IF @TempString != ''
   BEGIN
      SET @Ordinal += 1 
      INSERT   #Results
      VALUES   (@Ordinal, @TempString)
   END

SELECT   *
FROM     #Results

I took this answer from here but it should do the trick

【讨论】:

为什么您认为 SQL Server 解决方案(使用 T-SQL)可以在 HSQLDB 上运行?

以上是关于SQL - 使用多次出现的“/”拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

在DataFrame中多次拆分字符串

Python 3多次拆分字符串

通过正斜杠或什么都不拆分字符串

Python - 根据 2 个关键字拆分带有长字符串的列表

SQL:使用分隔符值拆分字符串

sql SQL:使用XML拆分字符串