1

Oracleバージョン:11.2.0.2.0

設定NLS_COMP = 'LINGUISTIC'NLS_SORT = 'BINARY_CI'ました。

LIKE先頭にワイルドカード(%)を付けずに比較を使用すると、正しい結果が返されません。これが一般的な例です。私の問題は明らかにクエリ#3にあります。誰かがこれを以前に経験しましたか?

CREATE TABLE People     
(      
  ID NUMBER(1,0),    
  FirstName NVARCHAR2(20),    
  LastName NVARCHAR2(20)
);    

INSERT INTO People (ID, FirstName, LastName) VALUES ('1', 'John', 'Doe');    
INSERT INTO People (ID, FirstName, LastName) VALUES ('2', 'Jane', 'Doe');    
INSERT INTO People (ID, FirstName, LastName) VALUES ('3', 'Rich', 'Donner');    
INSERT INTO People (ID, FirstName, LastName) VALUES ('4', 'Mike', 'Redoer');            

-- Query #1    
SELECT ID FROM People WHERE Lastname = 'doe';

-- Results (Correct)    
-- 1    
-- 2


-- Query #2    
SELECT ID FROM People WHERE Lastname LIKE '%doe%';

-- Results (Correct)    
-- 1    
-- 2    
-- 4


-- Query #3
SELECT ID FROM People WHERE Lastname LIKE 'do%';

-- Results (Incorrect)    
-- 1    
-- 2    
-- 3    
-- 4
4

1 に答える 1

0

クエリ 3 でこれが得られるのは、do% が次のように言っているからです。名字の文字列 'do' の後に 0 個以上の文字が含まれている人を見つけてください (そのため、Redoer も表示されます..)

Q3に期待する結果は?

アップデート

「do」だけで始めたい場合は、試すことができます

LIKE '[d]o%';

更新 2

ここで/テストをさらに読んだ後、あなたがやりたいこと(「do」で始まるものを見つける)について、NLS_SORT = 'BINARY_CI'は必要ありません。これは、ソートを大文字と小文字を区別しないように設定しているためです。最初の文字を大文字にする利点が失われ、そこで検索がめちゃくちゃになります。
したがって、最初の文字が Cap にあると仮定すると、必要なことは次のとおりです。

alter session set nls_comp='LINGUISTIC';  
SELECT ID FROM People WHERE Lastname LIKE 'Do%';

ID
1
2
3

これが私が行ったテストです、それが役立つことを願っています:)

于 2012-09-07T10:48:33.313 に答える