2

我正在使用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 个响应的原始环境待测试

4

2 回答 2

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
于 2011-02-12T05:23:54.750 回答
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
于 2011-02-12T02:10:55.260 回答