【发布时间】:2020-12-09 18:31:26
【问题描述】:
我仍在学习 oracle 中的正则表达式并遇到以下错误。下面是我的示例代码
SELECT DISTINCT COALESCE(TO_NUMBER(regexp_substr(USERNAME, '[^.]+', 1, 2)), ID) ID ,
COALESCE(regexp_substr(USERNAME, '[^.]+', 1, 1), USERNAME) AS USERNAME
FROM logs;
ORA-01722: invalid number
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.
Table Data
Username ID
Ravi.1234 1234
Krishna.12345 12345
Ravi.Krishna.1234567 1234567
R.Krishna.987 987
Ravi.K.567890 567890
R.Krish 123
Ravi 456
Expected Output
ID Username
1234 Ravi
12345 Krishna
1234567 Ravi.Krishna
987 R.Krishna
567890 Ravi.K
如何重构查询以获得所需的输出。可以使用 substr 代替 regexp 它会提供所需的输出吗?这用于oracle数据库而不是sql。提前致谢。
【问题讨论】:
-
让我帮你澄清你的问题。所以:在表数据中,你有两个字符串列。用户名由一个或多个用点分隔的“部分”组成。 ID 是一个单一的“字符串”(没有点)——可能完全由数字组成,但这可能很重要,也可能不重要。 (为您澄清!)然后:在查询中,您只想返回用户名的最后“部分”与 ID 匹配的那些行。对于这些行,您希望返回 ID,并单独返回删除 ID 后的用户名部分。这一切都正确吗?
-
然后:是的,所有这些都可以通过标准字符串函数和条件来完成(避免使用所有正则表达式)。那是你需要的吗?或者您是否也同时利用这个机会来了解更多关于正则表达式的知识?显然,最佳解决方案(不使用正则表达式!)不会帮助您实现最后一个目标,即更多地了解正则表达式。
-
是的,没有正则表达式,我希望提取数据。谢谢你的帮助。让我试试这个。
标签: sql oracle substr coalesce regexp-substr