- - PR -
Oracle Varchar2とCharの列によるテーブル結合
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-03-23 16:34
Oracleバージョン 10.1.0.2.0
<<症状概要>> Varchar2の列とCharの列で結合を行ったSQLが検索結果なしになってしまいます。 Varchar2の列は10桁ですが、値は2桁のみを保持し、Charの列は2桁の列です。 <<症状詳細>> @テーブル構成 --TABLE_A-- ID_KBN CHAR(2) KEY1 VARCHAR2(10) NAME1 VARCHAR2(30) --TABLE_B-- CD CHAR(6) KBN CHAR(2) Aデータ --TABLE_A-- ID_KBN | KEY1 | NAME1 '05' | '02' (後方スペースなし) | 'NAME02' '05' | '03' (後方スペースなし) | 'NAME03' --TABLE_B-- CD | KBN 'AAAAAA' | '02' BSQL SELECT A.NAME1 ,B.CD FROM TABLE_A A ,TABLE_B B WHERE A.KEY1(+) = B.KBN AND A.ID_KBN(+) = '05' AND B.KBN = '02'; C結果 KEY1 CD (NULL) 'AAAAAA' ↑なぜ(NULL)になるのか? 'NAME02'を取得して欲しい!! D疑問 ・B.KBNに対する条件を'02'〜'03'の範囲指定にすれば全て正しく取得できる。 ・外部結合ではなく、通常の結合を行うと正しく取得できる。 ・LEFT OUTER JOIN句を使ってもだめ。 ・A.KEY1もしくはB.KBNにRTRIMをかけると正しく取得できる。 ・A.KEY1もしくはB.KBNにRTRIM以外でも何か関数をかぶせると正しく取得できる。 ・他テーブルとの結合なしで、TABLE_A.KEY1をCHAR型のキーで検索すれば正しく取得できる。 何か分かる方がいらっしゃったらお助けください。 | ||||
|
投稿日時: 2006-03-29 09:40
答え方によっては契約情報関係で引っかかる内容で、どこまで答えられるのか
わからないので、結論だけを。 表題の条件では、正しい検索結果は得られません。 WHERE句で ・関数を使用して型変換する ・右辺、左辺の列の型は同一にする などで、回避するしか手は無かった気がしました。 | ||||
|
投稿日時: 2006-03-29 10:43
ご返答ありがとうございます。
>WHERE句で >・関数を使用して型変換する >・右辺、左辺の列の型は同一にする >などで、回避するしか手は無かった気がしました。 例であげましたTABLE_Aを汎用的に使っているシステムとなっており TABLE_A使用箇所を全て直すことが大変困難な状況になってしまって おります。 | ||||
|
投稿日時: 2006-03-29 10:48
型変換だったら困難でないと思いますが? 他で使用していても影響ないですから。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-03-29 12:48
ありがとうございます。
>型変換だったら困難でないと思いますが? >他で使用していても影響ないですから。 全てのTABLE_A使用箇所で上記のような検索方法をとっている可能性があるので 全ソースコードを見直す必要がでてきてしまいます。 | ||||
|
投稿日時: 2006-03-29 12:58
『可能性があるので』ですって?あなたの仕事じゃないの? まずはハッキリさせましょう。それは我々の仕事ではない。(あなたからお金貰ってないし) っていうか今までのところにどう影響するのかがわからんのですよ。 今までのところはそれで通っていたんでしょ。だったら何も影響ないんじゃないの? | ||||
|
投稿日時: 2006-03-29 13:37
実際のところの話をさせていただきますと、外注さんで作成していただいたプログラムで今回の問題が原因のバグが数件発生しておりまして、他にも同様のバグが潜んではいないか心配になりご相談しております。プログラムをさらっと見てみたところ、関数で型変換している箇所もあれば、そうでない箇所もあり、プログラム全てを確認するより簡単な方法がないかどうか探しているわけです。 すべては検収時のテスト不足が問題なのですが。。。 | ||||
|
投稿日時: 2006-03-29 13:53
なるほど。そういうことね。 でも、本来提出されたプログラムはすぐ検証するもんじゃない? 少なくとも初めのうちは信用できないからソースレベルでの検証が必要。 それができていればこんなことにはならなかったような気がする。 害…間違えたw外注に突っ返せないのであれば、あれこれ考える前に手分けして眺めるしかないですね。 SQLコマンドを生で書いてるとこういう作業の時つらいわね。 SqlConnectionか何かで検索してヒットしたところ見るしかないかな。 |