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 没有按预期工作,谁能解释一下?的主要内容,如果未能解决你的问题,请参考以下文章
oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?
ORACLE 官方只可以下载oracle11g 版本的数据库 没有了ORACLE 10g 是否ORACLE 10g 过期了 不能在官方下载