- PR -

SQLでのLIKEの使用について

投稿者投稿内容
どみの
会議室デビュー日: 2005/12/15
投稿数: 16
投稿日時: 2005-12-15 14:24
お世話になります。
どみのと申します。

VB開発にてMS2000のSQLより、データを参照することを行っておりますが、問題に
ぶつかり、悩んでおります。お忙しい中、申し訳ありませんが、どなたかアドバ
イスをいただけないでしょうか。

SQL:MS(マイクロソフト)SQL2000(英語版)
接続方法:ADO


 テキストフィールドをKEYとした場合で「あいまい検索:LIKE」が「@正常に機能
する場合」と「A機能しない場合」があり、当然ながらAについて悩んでおります。
「うまくいかない」というのは「該当するレコードが無い」という状態になるとい
う意味です。

■1.LIKEの指定
   以下のように検索値を「変数A」とし、後の2,3のように変数を設定しており
   その内容によって、@、Aのようにケースが分かれます。

   strSQL = "SELECT フィールド名 FROM テーブル名 " _
  & "WHERE フィールド名(Key) LIKE " _
  & "'[" & 変数A & "-" & 変数A & "]%'"
 
 ■2.正常に機能する場合@
   上記「1」のSQL文を実行する前に、以下のように半角英数字を1文字指定。
   この場合は、正常に該当レコードをとってきます。
   
 変数A = "A"("3"でも可)

 ■3.正常に機能しない場合A
   上記「1」のSQL文を実行する前に、以下のようにカナや全角文字を1文字指定。
   この場合は、正常に該当レコードをとってきません。(該当なし)

   変数A = "ア" ("あ"、"全"、"5"、"B"などの全角文字も全て不可)

   cf:LIKEの後、以下のような他の指定も半角であっても機能しませんでした。
     ・'%変数A%'
     ・'___変数'


■4.気になる点

   実は、以前、これに似た問題として「文字化け」という問題がありました。
   このMS-SQL2000(英語版)のデータをADOにて、SQL文でひっぱってきたら、
テキストフィールドに関し、全て文字化けしておりました。
   そこで、いろいろ悩んだ挙句、以下の設定の「@Translate=False」を施す
ことで文字化けが解消致しました。
   そこで、今回の問題もこのような設定絡みの問題ではないか?
と考えておりますがどのようにすれば良いのかがわかりません。

rs.open strSQL,cn

   Set cn = CreateObject("ADODB.Connection")
   Set rs = CreateObject("ADODB.Recordset")

   cn.open "Provider=SQLOLEDB ;Server=ServerA;Database=DataA; _
   Persist Security Info=TRUE;User ID=sa;Auto @Translate=False; _
   Current Language=Japanese;"

   それではよろしくお願い致します。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2005-12-15 15:12
正規表現にしなくても良いのでは?!
_________________
IEEE-CSDP 2004-2007
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-12-15 16:16
SELECTの最後に COLLATE Japanese_BIN をつけてみてください。
どみの
会議室デビュー日: 2005/12/15
投稿数: 16
投稿日時: 2005-12-15 18:08
おせわになります。

どみのです。

アドバイス頂きありがとうございます。

アドバイス頂いた、「COLLATE Japanese_BIN」で対応して
みたのですが、ダメでした。
全く、関係の無いレコードをひっぱってきました。

何か他に手立てはないものでしょうか?
どみの
会議室デビュー日: 2005/12/15
投稿数: 16
投稿日時: 2005-12-15 18:55
おせわになります。
どみのです。

「COLLATE Japanese_BIN」の使用について、返事が単純であったと思い
再度、詳しくお話致します。

SQLの記述は、以下のように行った結果、該当するレコードとは
全く、異なるレコードをひっぱってくるようになっております。

strSQL = "SELECT CSKS.KOSTL,CSKT.KTEXT,CSKT.LTEXT FROM CSKS " _
& "INNER JOIN CSKT ON (CSKS.MANDT = CSKT.MANDT) " _
& "AND (CSKS.KOKRS = CSKT.KOKRS) " _
& "AND (CSKS.KOSTL = CSKT.KOSTL) " _
& "AND (CSKS.DATBI = CSKT.DATBI) " _
& "WHERE (CSKS.MANDT = '100') " _
& "AND CSKS.KOKRS BETWEEN '1000' AND '9000' " _
& "AND CSKS.KOSTL BETWEEN '000000' AND 'ZZZZZZ'" _
& "AND CSKS.DATBI = 99991231 " _
& "AND CSKT.KTEXT LIKE" & "'%" & CoTB2 & "%'" _
& "COLLATE Japanese_BIN" _
& " ORDER BY CSKS.KOSTL "

(注)CoTB2は変数
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-12-16 12:04
じゃあこっちでもう一回。
COLLATE Japanese_CI_AS

※そもそもの原因はSQLServerのデフォルトの照合順序が日本語となっていないため起きているはずです。なので狙った文字コードの照合順序をCOLLATEで適用すればLIKEで抽出可能になるはず。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2005-12-16 12:50
引用:

どみのさんの書き込み (2005-12-15 14:24) より:
...
   strSQL = "SELECT フィールド名 FROM テーブル名 " _
  & "WHERE フィールド名(Key) LIKE " _
  & "'[" & 変数A & "-" & 変数A & "]%'"
...


   strSQL = "SELECT フィールド名 FROM テーブル名 " _
  & "WHERE フィールド名(Key) LIKE " _
  & "'" & 変数A & "%'" <- 変更部分

でいかがでしょうか?

_________________
IEEE-CSDP 2004-2007
どみの
会議室デビュー日: 2005/12/15
投稿数: 16
投稿日時: 2005-12-19 09:59
おせわになります。
どみのです。

アドバイスありがとうございました。


アドバイス頂いた「COLLATE Japanese__CI_AS」も試してみましたが
結果は「COLLATE Japanese_BIN」の時と同じでした。
まだ他に手立てはないものでしょうか。

strSQL = "SELECT CSKS.KOSTL,CSKT.KTEXT,CSKT.LTEXT FROM CSKS " _
& "INNER JOIN CSKT ON (CSKS.MANDT = CSKT.MANDT) " _
& "AND (CSKS.KOKRS = CSKT.KOKRS) " _
& "AND (CSKS.KOSTL = CSKT.KOSTL) " _
& "AND (CSKS.DATBI = CSKT.DATBI) " _
& "WHERE (CSKS.MANDT = '100') " _
& "AND CSKS.KOKRS BETWEEN '1000' AND '9000' " _
& "AND CSKS.KOSTL BETWEEN '000000' AND 'ZZZZZZ'" _
& "AND CSKS.DATBI = 99991231 " _
& "AND CSKT.KTEXT LIKE" & "'%" & CoTB2 & "%'" _
& "COLLATE Japanese__CI_AS" _
& " ORDER BY CSKS.KOSTL "

また、「大ベテラン」さんのアドバイスも対応してみましたが、
「半角英数字」の場合は、正常にとってこれますが、カナやその他
の全角に関しては、とってこれません。

皆様、大変お忙しい中、申し訳ありませんがよろしくお願い
致します。

スキルアップ/キャリアアップ(JOB@IT)