ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:tocci_pc 文字列のフィールドのOrderbyについて
困り度:
  • すぐに回答を!
Oracle9iです。(厳密にはVB6も絡んでいます)

説明の便宜上、若干簡略化しています。
テーブルtestがあります。

SQL> desc test;
名前 NULL? 型
--------- -------- ----------------
ID VARCHAR2(10)

です。

(1)testテーブルのデータが、
SQL> select id from test ;

ID
----------
3
5
11
551

のとき、select id from test where id between 1 and 4;を実行すると、
ID
-------
3

select id from test where id between '1' and '4';を実行すると、

ID
-------
3
11

となってしまいます。


別のケースで、
SQL> select id from test ;

ID
----------
3
5
11
551
C44433
aaa

6行が選択されました。
のデータの場合、
select id from test where id between 1 and 4;はORA-01722:数字が無効です のエラーとなり、
select id from test where id between '1' and '4';だと

ID
-------
3
11

となってしまいます。

自分の希望としては
select id from test where id between '1' and '4'にて、
ID
-------
3
のみ表示をさせたいです。

(2)SQL> select id from test ;

ID
----------
3
5
11
551
C44433
aaa

のとき、たとえば、
select id from test where id between '12' and 'DD';
を実行し、12以上でDD以下のデータを取得したいのですが、
(理想)
ID
----------
551
C44433

実際は、
ID
----------
3
5
551
C44433
と出てしまいます。


仕様は上司が考えてるので、
テーブル構造にそもそも問題があるのならそれ相応の説明をしたいと思っています。
ですが、基本的にはSQLの条件文を変更したいのですが、
アドバイスをいただけたらと思います。

ちなみに説明の簡略化のためフィールドを少なくしていますので
select RPAD(id , 10) from test where 〜 のように
select のあとに変換するのはできません。

実環境は基本的には select * from 〜としたいので。


よろしくお願いいたします。
質問投稿日時:07/08/27 13:43
質問番号:3290702
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

 

回答者:SUPER-NEO #1です。

既に設計の話になってしまっているようですが、
ご参考までに。

旧データのコードと新データのコードの2種類を持つことはできないんですか?
検索用に新コードを用意して、これを条件で使用するというものですが。
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:07/09/02 23:55
回答番号:No.2
この回答へのお礼検索用に新コードですか・・・

がんばって導入してみます。

ありがとうございました。

回答

良回答20pt

回答者:SUPER-NEO 客観的な意見になりますが、ご了承ください。


まず、コードに文字列型を使用する以上、
「1」と「11」を混在させる方法はどうかと思います。
例えば、1,2,3,・・・,10,11
というようにデータがあったとしますと、
これをソートした結果を見てみてください。

1,10,11,2,3・・・

という順序で結果が出てくると思います。
一般論としてデータベース内のコードは同じ桁数であるべきですし、
同じコード体型であるべきです。
今回、ご質問いただきましたコード設計で 10 桁となっているのなら、
仮に区分も何も無い、ただの数値項目であるであれば、
「0000000001」と「0000000011」とあるべきです。
そうすれば、
「Between '0000000001' AND '0000000004'」 という条件が
組めますよね?



あと、余談ですが、仮にこのプログラムが組めたとして、
パフォーマンス的に考えると、「SELECT * FROM 〜」を使うことは
好ましくありません。
検索する項目を列挙する書き方へしたほうが、
パフォーマンス向上に繋がりますよ。
参考まで。
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:07/09/02 09:28
回答番号:No.1
この回答へのお礼ほぼ予想通りの回答ですね。

>一般論としてデータベース内のコードは同じ桁数であるべきですし
実は、なぜこの質問をしたかというと、
旧システムが桁数がバラバラなんですよね。

新システム移行の際、旧データの書き換えを禁止されているので、お客様にどう持っていくのか悩んでいます。

ありがとうございました。
 
最新から表示回答順に表示良回答のみ表示