3

我正在与 Oracle 11g 的 SQL 开发人员合作。我有一个查询,看起来与此类似;

SELECT [column], [column], [column],...... rs.notes
FROM [table], [table], [table]............ return_sku rs
WHERE [conditions] AND [conditions] AND [conditions]

在该return_sku列中有制表符、空格和换行符(我相信这是回车?)我需要在运行查询时使所有这些空格、回车和制表符消失。

我对 SQL 还很陌生,但我发现最流行的搜索结果是 REPLACE 函数。我完全不知道如何使用它,因为我已经以许多不同的方式尝试了这个,但没有结果。我尝试了以下方法;

SELECT [column], [column], [column],...... REPLACE(rs.notes, Char(10), '')
FROM [table], [table], [table]............ return_sku rs
WHERE [conditions] AND [conditions] AND [conditions]

这给出了错误消息:

ORA-00904: "RS"."NOTES": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 3 Column: 531

如何正确使用此功能?

4

2 回答 2

8

在 Oracle 中,如果您只想删除一个字符,您可以省略 replace 调用的第三个参数,字符代码的函数是 chr(),而不是 char()。

所以你的线是SELECT ... replace(rs.notes,chr(10)) ...

于 2013-08-08T14:48:02.193 回答
4

这并没有解决 ORA-00904,我怀疑这是一个错字,但如果没有看到真正的代码就无法真正分辨。但是如果你需要去掉几个字符,你可以做一个嵌套替换:

with return_sku as (
    select 'This is '||chr(9)|| ' a split'||chr(10)||chr(13)||'line' as notes
    from dual
)
select replace(replace(replace(replace(rs.notes, chr(10)), chr(13)), chr(9)), ' ')
from return_sku rs;

REPLACE(REPLACE(
----------------
Thisisasplitline

...但是 aregexp_replace可能更易于管理,如果可能成本更高一些:

with return_sku as (
    select 'This is '||chr(9)|| ' a split'||chr(10)||chr(13)||'line' as notes
    from dual
)
select regexp_replace(rs.notes, '[ '||chr(10)||chr(13)||chr(9)||']')
from return_sku rs;

REGEXP_REPLACE(R
----------------
Thisisasplitline

我在两者中都包含了换行符(chr(10))和回车符(chr(13));可能是矫枉过正。但是,如果您确实想删除任何空格,这将变得更加简单:

select regexp_replace(rs.notes, '\s') ...

或 Posix 版本:

select regexp_replace(rs.notes, '[[:space:]]') ...

正如@randcd 指出的那样,如果 or 的第三个参数replaceregexp_replacenull(或空字符串,与 Oracle 中的 null 相同),那么您不需要提供它。

于 2013-08-08T15:07:33.963 回答