Oracle 10g中的REPLACE没有按照我的预期工作,任何人都可以解释一下吗?

时间:2011-02-12 00:21:52

标签: sql oracle string oracle10g ora-01403

我正在使用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), '.');

为什么我'找不到数据'我在文档的任何地方找不到解释。

btw我知道以下工作:

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

所以我认为其他声明不起作用,因为它不喜欢替换某些符号。

编辑:

在阅读前2个回复的原始环境上进行测试

2 个答案:

答案 0 :(得分:5)

它可能取决于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不匹配。

PS。 如果这是问题,那么一个修复就是

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

答案 1 :(得分:1)

下面显示两个表达式之间完全没有区别。它们是完全等效的,所以如果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