我会说表格的结构很糟糕 - 每个域都应该有一行。对于初学者来说,这将使解决方案变得非常困难。
您需要一段 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;