- PR -

SQL DECODE関数の使い方を教えてください

投稿者投稿内容
始まり
常連さん
会議室デビュー日: 2006/10/03
投稿数: 31
投稿日時: 2009-02-09 15:38
INFOテーブルにTITLEというカラムがあります。

TITLEの内容は数値+文字列が入っています
例:0918 テスト

このような行が複数行あったので、先頭の文字をみて結果内容を変えようと思ったのですが、「ORA-01722: 数値が無効です。」と表示されてしまいSQLが通りません。

以下が実行したSQLです


select DECODE(TITLE, 09, '19', 00,'20',NULL,'****','UNDEFINED')
from INFO;

幾つかDECODEを使用しているサンプルを拝見しましたが、記述の仕方が良く掴めませんでした。

よろしくお願いします。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-09 15:59
http://www.shift-the-oracle.com/sql/functions/decode.html
ごん太
大ベテラン
会議室デビュー日: 2002/07/30
投稿数: 182
お住まい・勤務地: 森の中
投稿日時: 2009-02-09 16:05
引用:

始まりさんの書き込み (2009-02-09 15:38) より:
先頭の文字をみて結果内容を変えようと思った

select DECODE(TITLE, 09, '19', 00,'20',NULL,'****','UNDEFINED')
from INFO;




先頭の文字をみるのであれば、SQL文のTITLE(項目名?)の頭2桁を取得しないといけませんよね?

SUBSTR(TITLE,1,2)
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-09 16:24
私がよくやるのは
例えば今回の例ですと

コード:

SELECT
    DECODE('0918 テスト', 09, '19', 00,'20',NULL,'****','UNDEFINED')
FROM
    DUAL


という SQL をまず作成し、実行します。
当然仰っている通りのエラーが出ます。
ここから関数のリファレンス等を調べて実行出来るようになるまで何度も修正します。
実行出来るようになったとしても思っていた物とは違う結果になっていた場合は
さらに修正を加えて行きます。
最終的に思い通りの結果になった時にプログラム側に反映させます。

結果から言うと文字列と数値を比較しているからエラーが出てます。
あと「先頭の文字をみて」という処理はこの SQL には入っていません。
始まり
常連さん
会議室デビュー日: 2006/10/03
投稿数: 31
投稿日時: 2009-02-09 17:26
Kingさん、ありがとうございます。

先頭文字を検索する場合、LIKEが使えそうなので考えてみます。
始まり
常連さん
会議室デビュー日: 2006/10/03
投稿数: 31
投稿日時: 2009-02-09 19:17
select
SUBSTR(TITLE,1,4) AS TITLE
from
INFO
where
TITLE >= SUBSTR(to_char(sysdate,'yyyy'),3,4)
AND
TITLE BETWEEN '10' AND '99' ORDER BY TITLE ASC

色々とやってみた所、DECODEでも可能でしたが、「なんとなく出来た」
という感じでしたので上記のようになりました。

これも使い方があっているのか微妙ですが^^;
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-09 21:26
すみません。
どういうレコードからどういう結果を取得したい SQL なのか、
何をどうしたい SQL なのかがわからないので
その SQL が合っているのかどうかは誰にもわかりません。

思い通りの結果が取得できたのなら問題ありませんが。

[ メッセージ編集済み 編集者: King 編集日時 2009-02-09 21:29 ]
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-10 09:38
自分で書いた SQL の意味はわかっていますか?
何をしたいのかよくわからない SQL です。
関数の意味は調べていますか?
基本的な構文はわかっているのでしょうか?
SELECT の意味とか。

> select
> SUBSTR(TITLE,1,4) AS TITLE

TITLE の先頭4文字を取得

> from
> INFO

INFO テーブルから

> where
>TITLE >= SUBSTR(to_char(sysdate,'yyyy'),3,4)

現在日時の年4桁部分の3文字目以降4文字(ありえない)

> AND
> TITLE BETWEEN '10' AND '99'

TITLE の値が文字列「10」と文字列「99」の範囲にある

>ORDER BY TITLE ASC

TITLE で昇順に並べる

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