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>と表現しています。