プログラマ38の日記

主にプログラムメモです。

SQL: MS-ACCESSで、結合条件で大文字・小文字を区別する

MS-ACCESSの結合は、通常では大文字・小文字の区別がありません。

たまに、大文字・小文字を区別して結合をしたい時があります。
例えば、Salesforceの15桁のSalesforceIDで結合する場合などです。

 

そんな時には、「strcomp(項目1, 項目2, 0) = 0 」を使うことで、大文字・小文字を区別して結合することができます。

 

[大文字・小文字を区別しないで結合するサンプルSQL]

SELECT * FROM sample1 
INNER JOIN sample2 
ON (sample1.field1 = sample2.field1)

 

[大文字・小文字を区別して結合するサンプルSQL]

SELECT * FROM sample1 
INNER JOIN sample2 
ON (sample1.field1 = sample2.field1)
and (strcomp(sample1.field1 , sample2.field1,0)=0)

上記のように通常の結合条件の後に、strcompでバイナリ比較を行うことで大文字・小文字を区別して結合することができます。

 

[補足]

普通に結合条件の結果だけ考えれば、下記のように通常の結合条件は不要でstrcompだけで欲しい結果は得られます。

SELECT * FROM sample1 
INNER JOIN sample2 
ON  (strcomp(sample1.field1 , sample2.field1,0)=0)

 ですが、上記の記述では、結合する項目にインデックスがあっても使ってくれません。(直積の実行プランになります)

思いのほか結合処理に時間がかかってしまうので、面倒でも結合条件とstrcompの比較条件と両方の記載が必要です。

 

strcompでの比較と通常の文字の比較は次のような結果になります。

No 比較の内容 値1 値2 strcomp(値1,値2,0) iif( 値1 = 値2 , 'equal' , 'not equal')
1 同じ値での比較 ABC ABC 0 equal
2 大文字と小文字の比較 ABC abc -1 equal
3 小文字と大文字の比較 abc ABC 1 equal
4 空文字と空文字の比較     0 equal
5 文字とnullの比較 ABC <null> <null> not equal
6 nullと文字の比較 <null> ABC <null> not equal
7 nullとnullの比較 <null> <null> <null> not equal

※nullと空文字の表記が難しかったので、nullは<null>と表現しています。