2
WITH t AS (
SELECT 'aaa
bbb' AS val FROM DUAL
)
SELECT val from t

此查询的结果是:

VAL    
-----
aaabbb

什么对我来说很清楚。

但是这个:

WITH t AS (
SELECT 'aaa
bbb' AS val FROM DUAL
)
SELECT val, replace(val, 'a', '-') AS replace from t;

返回:

VAL    |REPLACE
---------------------
aaa bbb| ---bbb

问题:在第二个示例中, VAL 列之间aaa和中的空格从哪里出现?bbb

PS我在SQLDeveloper(版本4.0.2.15)中测试了这个

更新

不仅replace会导致该错误,此查询还会:

WITH t AS (
SELECT 'aaa
bbb' AS val FROM DUAL
)
SELECT val   ---------
from t; 

结果是:aaa bbb

如果删除评论破折号,结果是没有空格。

4

1 回答 1

2

看起来它可能是一个错误。我在 11.2.0.2.0 中复制了它。调用似乎触发了对插入空格字符replace的值的某种副作用:val

WITH t AS (
SELECT 'aaa
bbb' AS val FROM DUAL
)
SELECT val, dump(val) from t;

"aaabbb"    Typ=96 Len=7: 97,97,97,10,98,98,98

WITH t AS (
SELECT 'aaa
bbb' AS val FROM DUAL
)
SELECT val, replace(val, 'a', '-'), dump(val) AS replace from t;

"aaa bbb"   "--- bbb"   Typ=96 Len=8: 97,97,97,32,10,98,98,98

请注意,换行符在 的原始值中val。在调用 的查询中replace,可能存在导致 的值val以某种方式转换的错误,从而导致插入空间。

编辑:根据 jonearles 的评论,这似乎是 SQL Developer 4.0 中的一个错误。当我在另一个工具(例如 Apex)中运行这些时,问题不会发生。

于 2014-06-08T14:12:37.260 回答