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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

SQL

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

3回答

1002閲覧

COALESCE関数の例題について(SQL)

kaiserdoragon

総合スコア21

Oracle

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

SQL

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/02/11 11:02

編集2020/02/11 11:32

SQLのCOALESCE関数の使い方がわからなくて質問させていただきます。

![イメージ説明

↑↑↑
こちらの表の空白部分にCOALESCE関数を用いると以下の形が実現できるそうです。

イメージ説明
↑↑↑
COALESCE関数を用いて空白部分にだけ「メモはNULLです」が挿入されています。

解答には

SQL

1SELECT 日付,費目 2COALESCE(メモ,'メモはNULLです)') AS メモ, 3入金額,出金額 4FROM 家計簿

とありますが、これで空白に部分に「(メモはNULLです)」と挿入されるのかがわかりません。

COALESCE関数は最初に見つかったNULLではない引数を返すと学習したのですが、その知識と上記の解答のコードがリンクしません。
NULLではない引数なので返すのは「メモ」ではないでしょうか??

ご教授よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/02/11 11:23

全角のかっこ、注意。
kaiserdoragon

2020/02/11 11:33

ご指摘ありがとうございます。 全角()を半角()へ修正いたしました。
guest

回答3

0

ベストアンサー

まず、COALESCE(メモ,'(メモはNULLです)') に注目します。
テーブル「家計簿」のカラム「メモ」にNULLが含まれる可能性があることを考慮して、
NULLだった場合に「(メモはNULLです)」を返すためにそう書いているようですね。
COALESCE()で加工しないで出力すると、
テーブル「家計簿」のカラム「メモ」にNULLだった場合に空欄として出力しているのが、
最初の画像の状態だと察します。
(SQLを実行する環境によっては、「(NULL)」と表示したり、「\N」と表示したりするケースもありますが。)

次にAS メモに注目します。
この「メモ」はテーブル「家計簿」のカラム「メモ」のことではなく、
ASの左側にあるものを名付けます、それは「メモ」です、という意味です。

そのため、
COALESCE(メモ,'(メモはNULLです)') AS メモ
を仮に
COALESCE(カモメ,'(メモはNULLです)') AS メモ
などと崩すと、そんなカラムはないのでエラーになりますが、
COALESCE(メモ,'(メモはNULLです)') AS カモメ
としてもエラーにはなりません。
カモメという名前のカラムとして扱われる正しい処理です。


COALESCE()の引数は、複数個並べられます。
その、並べた左側から順に、NULLかどうか評価して、
NULLじゃない値であれば、その値を返します。
NULLだったばあいは、右隣の値を評価します。

COALESCE(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'きさらぎ')
適切に「きさらぎ」を返します。

テーブル家計簿に納まるデータを1行ずつ評価して、
カラム「メモ」がNULLの場合に、
COALESCE(メモ,'(メモはNULLです)')

COALESCE(NULL,'(メモはNULLです)')
となり、
1つ目の引数メモがNULLだから
2つ目の引数'(メモはNULLです)'を評価してNULLじゃないので、
結果「(メモはNULLです)」を返します。

メモが'自分へのご褒美'だと、
COALESCE(メモ,'(メモはNULLです)')

COALESCE('自分へのご褒美','(メモはNULLです)')
となり、1つ目がNULLじゃないので「自分へのご褒美」を返します。

投稿2020/02/11 11:12

編集2020/02/11 11:40
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kaiserdoragon

2020/02/11 11:53

細かく丁寧にご回答いただきありがとうございます! そしてとても理解が深まり納得ができました! COALESCE()の引数にカラムそのもの??を引数として代入して一つずつ調べる作業が行われているとは知りませんでしたし、全く思っていませんでした……。。 本当にありがとうございます!!
guest

0

既にお答えは出ていますが、case文で書くとこんな感じ

sql

1SELECT 日付,費目, 2CASE WHEN メモ IS NULL 3 THEN '(メモはNULLです)' 4 ELSE メモ END AS "メモ", 5入金額,出金額 6FROM 家計簿;

COALESCEは、COALESCE(col1,col2,col3,col4)の様にNULLを左から順にNULLでない最初のカラムを拾ってくれますので便利に使えます。ちなみにこれもcaseで書くと

sql

1select 2case when col1 is null then 3 case when col2 is null then 4 case when col3 is null then 5 case when col4 is null then 6 null 7 else col4 end 8 else col3 end 9 else col2 end 10 else col1 end 11from hoge;

投稿2020/02/12 00:25

編集2020/02/12 00:45
amura

総合スコア333

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

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

0

上の絵で、二行目三行目のメモカラムが「空白」となっていますね。この空白がおそらく、値はNULL、という意思表示なのでしょう。COALESCE(メモ,'メモはNULLです)') メモNULL。だから、ふたつめの'メモはNULLです)'が返される、と。

投稿2020/02/11 11:15

編集2020/02/11 11:19
shiketa

総合スコア3971

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問