2

私はOracle10gExpressを使用しています。

私は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。これが問題である場合、1つの修正は

select to_char(1.25,'999.99','NLS_NUMERIC_CHARACTERS=.,') FROM DUAL
于 2011-02-12T05:23:54.750 に答える
1

これは、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
于 2011-02-12T02:10:55.260 に答える