0

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

dublin.ie;montreal.com;paris.com

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

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

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

4

1 回答 1

2

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

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

所以都柏林.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;
于 2012-09-13T12:49:16.987 回答