【问题标题】:Replace spaces, tabs and carriage returns替换空格、制表符和回车
【发布时间】:2013-08-10 08:02:52
【问题描述】:

我正在与使用 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

如何正确使用该功能?

【问题讨论】:

  • 错误提示您的return_sku 表没有notes 列;或者您丢失了别名,或者您在子查询中拥有该表及其别名。像这样重新键入代码而不是显示实际演示行为的内容的麻烦在于,您可能会在此过程中丢失实际问题,特别是如果它是一个错字。也许你可以通过只从那个表中选择来得到同样的错误,并且可以向我们展示表定义。应该是chr(10),顺便说一下,不是char(10)

标签: sql oracle select replace


【解决方案1】:

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

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

【讨论】:

  • 我完全忽略了这一点,因为我在一堆不同的项目中找到了答案,但完全忘记了我在这里问过的。非常感谢您的回复。这实际上是我偶然发现的。
【解决方案2】:

这并没有解决 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

...但是regexp_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 所指出的,如果replaceregexp_replace 的第三个参数为null(或空字符串,与Oracle 中的null 相同),那么您不需要提供它。

【讨论】:

  • 对于迟到的回复,我深表歉意。我完全忽略了这一点,因为我在一堆不同的项目中找到了答案,但完全忘记了我在这里问过的。非常感谢您的回复。
猜你喜欢
  • 2012-11-09
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
相关资源
最近更新 更多