Oracle 10g 中的 REPLACE 没有按预期工作,谁能解释一下?

Posted

技术标签:

【中文标题】Oracle 10g 中的 REPLACE 没有按预期工作,谁能解释一下?【英文标题】:REPLACE in Oracle 10g not working as I expected, can anyone explain? 【发布时间】:2011-02-12 00:21:51 【问题描述】:

我用的是oracle 10g express。

我有一个名为 Artists_i_hate 的表,我已经简化以更清楚地说明问题

ID | Name       | Opinion
-----------------------------
11 | jamesblunt | i hate him 

我运行语句

SELECT * FROM artists_i_hate WHERE to_char(ID)=REPLACE(to_char(1.1), '.');

为什么我得到“找不到数据”我在文档中的任何地方都找不到解释。

顺便说一句,我知道以下工作:

SELECT * FROM artists_i_hate WHERE to_char(ID)=REGEXP_REPLACE(to_char(1.1), '[^0-9]');

所以我认为另一个语句不起作用,因为它不喜欢替换某些符号。

编辑:

在已阅读前 2 个响应的原始环境中等待测试

【问题讨论】:

【参考方案1】:

这可能取决于 NLS 设置,因为在某些语言中,.不是小数点分隔符,所以 to_char(1.1) 不会给出 '1.1'

SQL> alter session set nls_numeric_characters = ',.';

Session altered.

SQL> select to_char(12.34) from dual;

TO_CH
-----
12,34

在这种情况下,REPLACE 不会更改任何内容,因此 ID 将不匹配。

附言。 如果这是问题,一种解决方法是

select to_char(1.25,'999.99','NLS_NUMERIC_CHARACTERS=.,') FROM DUAL

【讨论】:

感谢您的回复,直到星期一我才能检查 nls_numeric_characters 但数据库是用墨西哥西班牙语设置的,所以我想这可能是问题所在,我会告诉你跨度> 好的,您已经确定了问题,并且您的修复程序返回了“。”小数点分隔符很好,但是当我执行语句时:它仍然没有返回 2404 的表数据。以下语句确实返回了一个值: SELECT * FROM Artists_i_hate WHERE to_char(ID)=REPLACE(to_char(2.404), ',');这是为什么?【参考方案2】:

这表明这两个表达式之间绝对没有区别。它们是完全等价的,所以如果 REGEXP_REPLACE 有效,REPLACE 也一样。

CREATE TABLE tester2 AS
SELECT
    REGEXP_REPLACE(to_char(1.1), '[^0-9]') Col1,
    REPLACE(to_char(1.1), '.') Col2
from dual;

select * from tester2;    
select * from USER_TAB_COLUMNS where table_name = 'TESTER2';

输出:

COL1    COL2
11    11

TABLE_NAME COLUMN_NAME DATA_TYPE  DATA_LENGTH   
TESTER2 COL1        VARCHAR2   2
TESTER2 COL2        VARCHAR2   2

【讨论】:

感谢您的回复,实际上我最初测试的数字是 2.403 和 db 表中的 2403,但我想长度应该没有区别。我无法在星期一之前重新测试,但我会尽快检查,同时我会将您的答案标记为正确。

以上是关于Oracle 10g 中的 REPLACE 没有按预期工作,谁能解释一下?的主要内容,如果未能解决你的问题,请参考以下文章

如何卸载10G的ORACLE?

安装oracle10g兼容模式没有windowsxp选项

oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?

ORACLE 官方只可以下载oracle11g 版本的数据库 没有了ORACLE 10g 是否ORACLE 10g 过期了 不能在官方下载

Oracle 10 g 中的执行树

在 oracle 表单 10g 中的 LOV 填充后未触发后查询触发器