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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

458閲覧

うまく置換ができない

perro69

総合スコア7

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2018/02/22 00:55

編集2018/02/22 11:51

レコードが取れない場合にうまく置換が出来ません。

たとえば、下記のようなテーブルでIDが存在しない場合
select nvl(name,'no') name from table where id =3;
のようにしても置換が出来ない状況です。

テーブル内容

id name
1 aya
2 saya

皆様の知恵をお貸しください!
DB:Oracle12c

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

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

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

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

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

guest

回答3

0

解決済みですが、LEVEL疑似列CONNECT BYを使用して、欠番を求める事ができます。
以下、OrlofskyさんのSQLを拝借して置き換えてみました。

SQL

1WITH RANGE_LIST AS ( 2 SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=(select max(id) from table1) 3) 4select RL.ID 5 , NVL(T1.name,'no') AS name 6FROM RANGE_LIST RL 7LEFT OUTER JOIN table1 T1 8ON RL.ID = T1.ID 9ORDER BY RL.ID ;

投稿2018/02/22 05:48

sazi

総合スコア25173

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

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

0

~~テーブル内容のnameに null のものがないのが気になりますが、
例えば id=2のものが null であれば、

SELECT NVL(NAME, 'no') FROM SAMPLE WHERE ID=2

で no が出力されますよ。~~

上記はミスです(削除依頼を出しています)

投稿2018/02/22 01:11

編集2018/02/22 01:14
A-pZ

総合スコア12011

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

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

perro69

2018/02/22 01:23

A-pz様 ご回答ありがとうございます。 レコードが取れない場合に置き換えを考えていました。 やはりレコードが取れないとそもそも置き換え出来ないのですね。
guest

0

ベストアンサー

SQLは対象レコードがなければ行はSELECTされません。

PL/SQL

1SET SERVEROUTPUT ON 2DECLARE 3 L_NAME table1.name%TYPE; 4BEGIN 5 BEGIN 6 select name INTO L_NAME from table1 where id = 1; 7 EXCEPTION 8 WHEN NO_DATA_FOUND THEN 9 L_NAME := 'no'; 10 END ; 11 DBMS_OUTPUT.PUT_LINE(L_NAME) ; 12END ; 13/

なんて方法もあります。

追記、
SQLだけでやりたければ連番?用のテーブルを用意してJOINすることもできます。

SQL

1WITH RANGE_LIST AS 2 ( 3 SELECT 1 AS ID FROM DUAL UNION ALL 4 SELECT 2 FROM DUAL 5 ) 6select RL.ID 7 , nvl(T1.name,'no') AS name 8FROM RANGE_LIST RL 9LEFT OUTER JOIN table1 T1 10ON RL.ID = T1.ID 11ORDER BY RL.ID ;

投稿2018/02/22 01:11

編集2018/02/22 01:36
Orlofsky

総合スコア16415

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

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

perro69

2018/02/22 01:25

Orlofsky ご回答ありがとうございます。 やはりレコードが取得できないと置き換え出来ないのですね。 なんとかSQLで実現したかったのですが無理のようですね。
Orlofsky

2018/02/22 01:37

SQLだけで実行する方法を追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問