質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

Q&A

解決済

3回答

6361閲覧

NVLで値の置き換えができない。

tryCSharp

総合スコア29

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

0グッド

0クリップ

投稿2018/06/21 23:05

編集2018/06/21 23:11

前提・実現したいこと

あるテーブルの値がNULLだったらスペース1文字に変換したいがNVLを使っても結果がNULLになる。

発生している問題

NVLを使用しているが結果がNULLになる。

該当のソースコード

SQL

1CREATE TABLE 項目 2( 3 項目NO NUMBER(2,0) NOT NULL, 4 項目名 VARCHAR2(50) NOT NULL, 5 primary key(項目NO) 6); 7INSERT INTO 項目(項目NO, 項目名) VALUES (1, '項目1'); 8INSERT INTO 項目(項目NO, 項目名) VALUES (2, '項目2'); 9INSERT INTO 項目(項目NO, 項目名) VALUES (3, '項目3'); 10INSERT INTO 項目(項目NO, 項目名) VALUES (4, '項目4'); 11 12SELECT NVL(項目名, ' ') FROM 項目 WHERE 項目NO = 5;

補足情報(FW/ツールのバージョンなど)

Oracle: Oracle 11g
ツール: A5M2 2.12.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/06/22 01:03

テーブル単独での話ではなくてそのテーブルを外部結合した場合が本当に質問したい意図だと思いますので、そちらの内容に質問を変更されたほうが良いと思います。
tryCSharp

2018/06/22 01:10

「SELECT NVL(項目名, ' ') FROM 項目 WHERE 項目NO = 5;」が効かないのも疑問でしたし、一応タイトルと質問内容は合っていると思われるのでこのままとさせていただきます。ご提案ありがとうございます。
guest

回答3

0

テーブルを持たない場合は、基準となる表を代わりに作ったほうがスッキリします。

dual表をunionでつないでいく方法

SQL

1with list as 2  select 1 item from dual 3 union all 2 from dual 4567 union all 30 from dual 8) 9select item, 項目名 10from list left join 項目 11 on list.item=項目.項目NO 12order by item

または、展開したい列挙文字から展開 
※'1,2,3,4,5'の部分を1~30まで列挙します。

SQL

1with list as 2  select distinct to_number(trim(regexp_substr(item, '[^,]+', 1, level))) item 3  from (select '1,2,3,4,5' item from dual) t 4  connect by instr(item, ',', 1, level - 1) > 0 5) 6select item, 項目名 7from list left join 項目 8 on list.item=項目.項目NO 9order by item

投稿2018/06/22 01:33

編集2018/06/22 01:55
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tryCSharp

2018/06/22 06:46 編集

裏の質問(?)にお答えいただきましてありがとうございます! 1つ目のご回答はなんとなく理解できましたが2つ目のご回答はまだまだ不勉強で理解に時間がかかりそうです。
guest

0

ベストアンサー

項目NO = 5 の行は存在しないからSELECTできないし、

項目名 VARCHAR2(50) NOT NULL,

とNOT NULL制約が付いているから、NULLのデータはINSERTできません。

投稿2018/06/21 23:11

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tryCSharp

2018/06/22 00:52

ご回答ありがとうございます。 行がなければ値がNULLではなくSELECT自体できていないということですね。 ちなみに先ほどこういう記事を見付けたのですが、SUMしたものは効くのですね。(試したところ、0が返りました) http://confrage.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E3%81%A7sum%E3%81%A8nvl%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8C%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D%E3%81%AB0%E3%82%92%E8%BF%94%E3%81%99/
Orlofsky

2018/06/22 00:59

グループ関数が絡むと何度もSQLを実行してカラダで覚えるようなところがあります。 >関西で140-170/80~120万から受け付けております^^ わたしもこのくらい稼げるようになりたいもの。
tryCSharp

2018/06/22 03:51

私はフリーなんて夢のまた夢です(^^;
guest

0

レコードが存在しないため、NULLが返ってきているかと思います。
項目がNULLになっているのではなく、レコードが返ってきていません。レコードが返って来る場合は正しく動作するかと思います。

追記

Orlofskyさんの言う通り、そもそも項目が「Not Null」なのでNULL値が登録できませんね。
もともとやりたかったこととしては、レコードがない場合に何かしたかった、または問題があったということでしょうか?

投稿2018/06/21 23:10

編集2018/06/22 00:27
takyafumin

総合スコア2335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tryCSharp

2018/06/22 09:42 編集

>もともとやりたかったこととしては、レコードがない場合に何かしたかった、または問題があったということでしょうか? すみません。実は項目名を一括で取得したく、項目NOはMAX30だが未登録の場合もあるとして以下のようなSELECT文を書きたかったのです。 SELECT * FROM (SELECT NVL(項目名, ' ') FROM 項目 WHERE 項目NO = 1), (SELECT NVL(項目名, ' ') FROM 項目 WHERE 項目NO = 2), (SELECT NVL(項目名, ' ') FROM 項目 WHERE 項目NO = 3), (SELECT NVL(項目名, ' ') FROM 項目 WHERE 項目NO = 4), (SELECT NVL(項目名, ' ') FROM 項目 WHERE 項目NO = 5), ・・・ (SELECT NVL(項目名, ' ') FROM 項目 WHERE 項目NO = 30) ですが先ほど以下のサイトを見付けまして解決策が見つかりました。 http://bleis-tift.hatenablog.com/entry/20081128/1227843974
tryCSharp

2018/06/22 01:04

takyafuminさん 申し訳ございません。 先に本質問にご回答いただいたOrlofskyさんをベストアンサーにさせていただきます。
takyafumin

2018/06/22 01:20

いやいや、おおもとの問題が無事解決したようで何よりです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問