- PR -

HiRDBにNVLってあるのでしょうか?

投稿者投稿内容
未記入
会議室デビュー日: 2006/02/21
投稿数: 16
投稿日時: 2006-04-05 13:32
HiRDB初心者です。
SELECTした結果がNULL、または存在するデータが無い場合は、固定の値を挿入しようと思っています。

SELECT NVL(AAA,'nodata')
FROM TABLE_A

マニュアルをみたのですが、NVLらしい関数を見つけられませんでした。
ご教授、お願い致します。
かずくん
会議室デビュー日: 2006/02/21
投稿数: 9
投稿日時: 2006-04-05 14:09
引用:

マニュアルをみたのですが、NVLらしい関数を見つけられませんでした。



COALESCE ってないでしょうか?
Oracle の NVL と同等(+α)で ANSI準拠の関数です。
Oracleでも9i以上で使えますし、DB2、PostgreSQLや
MYSQL の新しいバージョンのもの、SQL Server2005など
使えたと思います。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-04-05 22:38
引用:

未記入さんの書き込み (2006-04-05 13:32) より:
HiRDB初心者です。
SELECTした結果がNULL、または存在するデータが無い場合は、固定の値を挿入しようと思っています。

SELECT NVL(AAA,'nodata')
FROM TABLE_A

マニュアルをみたのですが、NVLらしい関数を見つけられませんでした。
ご教授、お願い致します。




マニュアルにあるCASE式の部分にありますよ。
未記入
会議室デビュー日: 2006/02/21
投稿数: 16
投稿日時: 2006-04-06 09:48
返信ありがとうございます。

マニュアルを見て、以下のように作って実行してみたのですが、
「NULLは入れられない」というエラーが出てしまいます・・・。
なにか間違いなどありますでしょうか?
ご指摘、お願いします。

UPDATE TABLE_A A
SET koumoku3 = ( SELECT COALESCE( B.koumoku3, 'nodata' )
    FROM TABLE_B B
    WHERE A.koumoku4 = B.koumoku4
    AND A.koumoku5 = B.koumoku5
    AND A.koumoku6 = B.koumoku6 )
WHERE A.koumoku1 ='1'
AND  A.koumoku2 ='2'

今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-04-06 10:18
引用:

未記入さんの書き込み (2006-04-06 09:48) より:
返信ありがとうございます。

マニュアルを見て、以下のように作って実行してみたのですが、
「NULLは入れられない」というエラーが出てしまいます・・・。
なにか間違いなどありますでしょうか?
ご指摘、お願いします。

UPDATE TABLE_A A
SET koumoku3 = ( SELECT COALESCE( B.koumoku3, 'nodata' )
    FROM TABLE_B B
    WHERE A.koumoku4 = B.koumoku4
    AND A.koumoku5 = B.koumoku5
    AND A.koumoku6 = B.koumoku6 )
WHERE A.koumoku1 ='1'
AND  A.koumoku2 ='2'




確認させてください。

SELECT文で返される行数は必ず1行ですか?
#0行のパターンがありえるのか否かが気になりました。

また、SELECT単体で実行したときはちゃんとNULLが'nodata'に置き換わっていますか?

未記入
会議室デビュー日: 2006/02/21
投稿数: 16
投稿日時: 2006-04-06 10:44
SELECT文で返される行数は必ず1行ですか?
#0行のパターンがありえるのか否かが気になりました。

→0行の場合もあります。説明が足りませんでした。
 取ってくるデータが無い場合、NULLが挿入されると考えていたので、この質問になっ てしまいました・・・。先ほどのエラーも該当データ無しの時に出ています。

質問自体間違ってますね^^;。
データ無しの場合にエラーを回避する方法はあるのでしょうか?
何度もすいません(シ_ _)シ。


未記入
会議室デビュー日: 2006/02/21
投稿数: 16
投稿日時: 2006-04-06 10:53
追加です。

#SELECT単体で実行したときはちゃんとNULLが'nodata'に置き換わっていますか?

→データ無しの行には、桁数分の*が戻ってきました。以下のような感じです。
EXP(1)
-------------
1234567890123
*************

以上、よろしくお願い致します。


今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-04-06 11:42
データがない場合にNULLになります。
で、NULLは駄目だよ!ってHiRDBが教えてくれているのです。
よってデータがない場合を考慮してSQLを作ってあげる必要があるのです。

一応、整理がてらまとめて見ましょう。
コード:

SELECT COALESCE( B.koumoku3, 'nodata' ) 〜(以下略)


では、取得したB.koumoku3の値がNULLだったら'nodata'に置き換える
っていう指定をしていますね。

よって、データがない場合はCOALESCEは動かないのです。

では、データがない場合はどうするか?って考えると
パターンとしては
1)必ずデータがある状態にする。
2)データがない場合にCOALESCEを使うようにする
という2つが大まかに考えられると思います。

1)のパターンですと、たとえばMAXやMINを用いて1件取得されるようにし、
その結果がNULLの場合を考慮してCOALESCEを使うようにする。
2)のパターンですと、たとえば外部結合して、取得された値がNULLの場合に
COALESCEを使うようにする。

など、考えられます。

とりあえずデータパターンなど分からないので、
現状でさっくり考え付いた方法を挙げてみました。

#いまHiRDBv7をインストール中で、検証できていないので
#100%いけると言い切れませんが、
#HiRDB特有の話ではないので、たぶん大丈夫かなぁ?と思います。
#こんな回答で申し訳ない。


===================================================================
以下追記
===================================================================

HiRDBでちゃんと以下のようなSQLを受け付けてくれることも確認しました。

コード:

SELECT
COALESCE(
(SELECT max(telno) FROM custom B where B.トクイサキCD = A.トクイサキCD AND B.ジユウシヨ = 'XXX' ) , 'nodata' )
FROM custom A
WHERE A.ZIPCD = '091';




[ メッセージ編集済み 編集者: 夏椰|。σ)o 編集日時 2006-04-06 12:05 ]

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