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

时间:2012-09-13 11:53:44

标签: sql database string oracle-sqldeveloper

SQL新手。使用oracle sql developer 3.1.07版。有没有办法分隔包含字符串的字符串列的元素:

dublin.ie;montreal.com;paris.com

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

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

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

1 个答案:

答案 0 :(得分:2)

我说这个表格结构很糟糕 - 每个域都应该有一行。这对初学者来说很难解决。

你需要一段sql,它将为存储在的每个域创建一行;分开的清单。

所以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”为“Great Britain”等等上。

我通过为每个逗号分隔值创建一行(在内存中)来解决这个问题,将这些行连接到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;