【发布时间】:2020-08-19 11:39:42
【问题描述】:
我在表中有一个列,它按顺序存储数据。一些数据使用连字符分隔,一些数据使用逗号分隔。我想将数据拆分成行。问题是逗号分隔的值在每个逗号之后被视为单个值,但对于连字符,它意味着一种数据范围。
例如,如果字符串是这样的'A1, A2, A4',则表示有 3 个值,将被转换为 3 行。还有像'A1-A4'这样的字符串,这意味着有4个值,将被转换为4行,因为连字符表示值的范围,表示起始值和结束值。
我能够转换逗号分隔的值,但不确定如何在 oracle 中拆分连字符分隔的范围。
SELECT regexp_substr('A1,A2,A4' , '[^,]+', 1, level) as a
FROM dual
CONNECT BY regexp_substr('A1,A2,A4', '[^,]+', 1, level) is not null
以上 ddl 将提供的字符串转换为 3 行,这很好。
SELECT regexp_substr('A1-A4' , '[^-]+', 1, level) as a
FROM dual
CONNECT BY regexp_substr('A1-A4', '[^-]+', 1, level) is not null
但上面的查询应该返回 4 行,但我不知道如何实现这一点。 有什么想法吗?
【问题讨论】:
-
'A1-A4' 仅包含一个 '-'。所以预期的结果是 2 行而不是 4 行?
-
A1-A4 表示从 A1 到 A4 的数据,
'A1, A2, A3, A4' -
不是 SQL 语言。 'A1-A4' 是一个精确的字符串,regexp_substr 函数完全按照提供的参数作为参数。
-
尝试使用
'A1-A2-A3-A4'运行您的查询。 -
DBMS 应该如何知道
A1-A4对您意味着什么?您希望它表示从 A1 到 A4 的所有值,但是有多少个值?A1.1、A1.2等是否存在于该范围内?你制定规则,所以你必须对此进行编程。对于编程,我们通常使用编程语言。如果我是你,我会因此在 PL/SQL 中编写一个函数。在那里,您可以简单地遍历您的字符串并轻松解决诸如'A1-A3,A5,A6-A7,A9'之类的表达式。