- PR -

Oracle Varchar2とCharの列によるテーブル結合

投稿者投稿内容
adtk
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 75
投稿日時: 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/01/21
投稿数: 23
投稿日時: 2006-03-29 09:40
答え方によっては契約情報関係で引っかかる内容で、どこまで答えられるのか
わからないので、結論だけを。

表題の条件では、正しい検索結果は得られません。


WHERE句で
・関数を使用して型変換する
・右辺、左辺の列の型は同一にする
などで、回避するしか手は無かった気がしました。

adtk
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 75
投稿日時: 2006-03-29 10:43
ご返答ありがとうございます。

>WHERE句で
>・関数を使用して型変換する
>・右辺、左辺の列の型は同一にする
>などで、回避するしか手は無かった気がしました。

例であげましたTABLE_Aを汎用的に使っているシステムとなっており
TABLE_A使用箇所を全て直すことが大変困難な状況になってしまって
おります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-29 10:48
引用:

adtkさんの書き込み (2006-03-29 10:43) より:

例であげましたTABLE_Aを汎用的に使っているシステムとなっており
TABLE_A使用箇所を全て直すことが大変困難な状況になってしまっております。


型変換だったら困難でないと思いますが?
他で使用していても影響ないですから。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
adtk
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 75
投稿日時: 2006-03-29 12:48
ありがとうございます。

>型変換だったら困難でないと思いますが?
>他で使用していても影響ないですから。

全てのTABLE_A使用箇所で上記のような検索方法をとっている可能性があるので
全ソースコードを見直す必要がでてきてしまいます。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-03-29 12:58
引用:

adtkさんの書き込み (2006-03-29 12:48) より:
全てのTABLE_A使用箇所で上記のような検索方法をとっている可能性があるので
全ソースコードを見直す必要がでてきてしまいます。


『可能性があるので』ですって?あなたの仕事じゃないの?
まずはハッキリさせましょう。それは我々の仕事ではない。(あなたからお金貰ってないし)

っていうか今までのところにどう影響するのかがわからんのですよ。
今までのところはそれで通っていたんでしょ。だったら何も影響ないんじゃないの?
adtk
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 75
投稿日時: 2006-03-29 13:37
引用:

ぶさいくろうさんの書き込み (2006-03-29 12:58) より:
『可能性があるので』ですって?あなたの仕事じゃないの?
まずはハッキリさせましょう。それは我々の仕事ではない。(あなたからお金貰ってないし)

っていうか今までのところにどう影響するのかがわからんのですよ。
今までのところはそれで通っていたんでしょ。だったら何も影響ないんじゃないの?



実際のところの話をさせていただきますと、外注さんで作成していただいたプログラムで今回の問題が原因のバグが数件発生しておりまして、他にも同様のバグが潜んではいないか心配になりご相談しております。プログラムをさらっと見てみたところ、関数で型変換している箇所もあれば、そうでない箇所もあり、プログラム全てを確認するより簡単な方法がないかどうか探しているわけです。
すべては検収時のテスト不足が問題なのですが。。。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-03-29 13:53
引用:

adtkさんの書き込み (2006-03-29 13:37) より:
実際のところの話をさせていただきますと、外注さんで作成していただいたプログラムで今回の問題が原因のバグが数件発生しておりまして、他にも同様のバグが潜んではいないか心配になりご相談しております。プログラムをさらっと見てみたところ、関数で型変換している箇所もあれば、そうでない箇所もあり、プログラム全てを確認するより簡単な方法がないかどうか探しているわけです。
すべては検収時のテスト不足が問題なのですが。。。


なるほど。そういうことね。
でも、本来提出されたプログラムはすぐ検証するもんじゃない?
少なくとも初めのうちは信用できないからソースレベルでの検証が必要。
それができていればこんなことにはならなかったような気がする。

害…間違えたw外注に突っ返せないのであれば、あれこれ考える前に手分けして眺めるしかないですね。
SQLコマンドを生で書いてるとこういう作業の時つらいわね。
SqlConnectionか何かで検索してヒットしたところ見るしかないかな。

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