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

Posted

技术标签:

【中文标题】SQL:使用分隔符值拆分字符串【英文标题】:SQL: split string using a separator value 【发布时间】:2012-09-13 11:53:43 【问题描述】:

SQL 新手。使用 oracle sql developer 版本 3.1.07。有什么方法可以分隔包含如下字符串的字符串列的元素:

dublin.ie;montreal.com;paris.com

我想根据; 拆分它们,以便我可以单独操作它们(并且对表格的每一行都这样做)。这是因为我想删除以.com 结尾的所有内容,但不影响其余部分。

我想使用最基本的 sql,因为我是新手,而且我使用的是相当旧的版本。

有什么想法吗?再次感谢你们。到目前为止,帮助很大。

【问题讨论】:

Splitting comma separated string in a PL/SQL stored proc 的可能重复项 【参考方案1】:

我会说表格的结构很糟糕 - 每个域都应该有一行。对于初学者来说,这将使解决方案变得非常困难。

您需要一段 sql 来为存储在 ; 中的每个域创建一行。分隔列表。

so dublin.ie;montreal.com;paris.com;bristol.uk

变成:-

dublin.ie
montreal.com
paris.com 
bristol.uk

然后将没有.com的行绑定回单行,得到

dublin.ie; bristol.uk

我遇到了类似的问题 - 我有一个包含逗号分隔的国家/地区代码的字段。 我为想要的国家名称工作的报告用户。我有一个包含国家代码和国家名称的 COUNTRY 表,但逗号分隔的列表不会加入它,因为它有“GB,FR,IT”,其中国家表有“GB”代表“英国”等等开。

我通过为每个逗号分隔值创建一行(在内存中)来解决这个问题,将这些行连接到 COUNTRY 表,返回国家/地区名称,然后将国家/地区名称绑定回一行,例如这个:-

“英国、法国、意大利”。

这是我使用的代码 - 但它不适合初学者。您可能想尝试使用 REPLACE、INSTR 和 SUBSTR,但您需要提前知道每个字段包含多少条目,否则您可能需要使用 PLSQL 在循环中工作。

如果我是你,我会要求 DBA(如果可能的话)正确地构造数据,以便字段包含原子值,而不是值数组。

SELECT ROW_SPLIT.CONTRACT_ID,
    WM_CONCAT(ROW_SPLIT.COUNTRY_NAME) AS COUNTRY_LIST
  FROM
    (SELECT PQ.ID AS CONTRACT_ID,
      PQ.COUNTRY_CODE,
      COUT.TEXT AS COUNTRY_NAME
    FROM
      (SELECT ID,
        extract(value(d), '//row/text()').getStringVal() AS COUNTRY_CODE
      FROM
        (SELECT ID,
          XMLTYPE('<rows><row>'
          || REPLACE(EXCLUDED_NATIONALITIES, ',', '</row><row>')
          || '</row></rows>') AS xmlval
        FROM PROPERTY_CONTRACT
        ) x,
        TABLE(xmlsequence(extract(x.xmlval, '/rows/row'))) d
      ) PQ
    JOIN COUNTRY C
    ON C.CODE = PQ.COUNTRY_CODE
    LEFT OUTER JOIN TEXT COUT
    ON C.CODE         = COUT.CODE
    AND COUT.CATEGORY = 'COUNTRY'
    AND COUT.LANGUAGE = 'en'
    ORDER BY PQ.ID,
      COUT.TEXT
    ) ROW_SPLIT
  GROUP BY ROW_SPLIT.CONTRACT_ID;

【讨论】:

谢谢史蒂夫,我知道正在使用的数据库并不理想。另一个存储这些的表将是最好的解决方案。不幸的是,我们正在使用一个与名为 IQMS 的数据库结合使用的系统,无论出于何种原因,它都无法支持这一点(所以 DBA 还是这么说的)。所以我认为我可以逻辑地做的是1.用';'分隔字符串2. 将这些临时存储在内存中 3. 删除该行中带有 .com 的任何内容 4. 将剩余的行连接成一个字符串并将其放回原始行中。您认为这是完成任务的合理方式吗?再次感谢!欣赏! 是的,最好重组memort中的数据,删除行,然后将它们拼接回字符串并更新原始行。祝你好运!

以上是关于SQL:使用分隔符值拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 WHERE IN SQL 子句将字符串值从单个值拆分为多个值以获取数据

将 T-SQL 表值函数字符串拆分为 C#

sql将字符串拆分为始终相同数量的片段

使用oracle SQL按分隔符位置拆分字符串

使用 Oracle SQL 将可变长度分隔字符串拆分为列

SQL:使用 SQL 将两个逗号分隔的字符串拆分为单独的索引行