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:使用分隔符值拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章