« ☆XQuery 親ノードへのアクセス | トップページ | ☆検索文字列の分解? »

☆照合順序 COLLATE

これもDelphiの話ではなくSQL Serverの話です。
SQL Serverでは、文字列の照合時に COLLATE を使うと半角全角を無視したり、反対に厳格にしたりできます。
[Field1のデータ]
コンクリート
こんくりーと
コンクリート

(A)
SELECT FIELD1 FROM TABLE1 WHERE FIELD1 COLLATE
 Japanese_BIN LIKE '%こんくりーと%'

[表示結果]
こんくりーと

(B)
SELECT FIELD1 FROM TABLE1 WHERE FIELD1 COLLATE
 Japanese_CI_AS LIKE '%こんくりーと%'

[表示結果]
コンクリート
こんくりーと
コンクリート

上記の例については、いまさら説明は要らないかも知れませんね。
ただ、私がはまったのは次のようなものでした。


[FIELD1のデータ]
コンクリート
こんくりーと
コンクリート

[FIELD2のデータ]
null
null
fc=21

(A)
SELECT FIELD1 FROM TABLE1 WHERE (FIELD1+' '+FIELD2) COLLATE
 Japanese_BIN LIKE '%こんくりーと%'

[表示結果]
なし

(B)
SELECT FIELD1 FROM TABLE1 WHERE (FIELD1+' '+FIELD2) COLLATE
 Japanese_CI_AS LIKE '%こんくりーと%'

[表示結果]
コンクリート

FIELD2を足しただけなのになんで期待した結果にならないのだろう?とずっと悩んでしまいました。結局、文字列+NULLになっていることに気づいたときには、なんでこんな初歩的なことで・・・とショックでした。
対応策としては、FIELD1とFIELD2を分けて、それぞれの照合をORで繋ぐか、テーブル作成時にNULLを許可しない等の工夫が必要になるようです。

|

« ☆XQuery 親ノードへのアクセス | トップページ | ☆検索文字列の分解? »