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

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

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

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

Q&A

解決済

2回答

290閲覧

PostgeSQL 複数列のNULL値を一斉にデフォルト値に変更する表現について

inup_inup

総合スコア1

PostgreSQL

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

0グッド

0クリップ

投稿2023/10/05 11:01

実現したいこと

例えば以下の表について、NULL値である箇所をすべて0に変換した文をSELECTしたいです。

<例> 成績テーブル

//学校名 | 生徒名 | 試験結果_国語 | 試験結果_数学 | 試験結果_英語
// -------+-------+----------------+----------------+----------------
// A校 | 田中 |   90   |        |
// A校 | 鈴木 |   85   |    65   |   30
// B校 | 佐藤 |        |    30   |   45

現在はこのように記述していますが、もっと簡潔な書き方があれば知りたいです。

PostgreSQL

1SELECT 学校名, 生徒名, 2 COALESCE(試験結果_国語, 0), 3 COALESCE(試験結果_数学, 0), 4 COALESCE(試験結果_英語, 0) 5FROM 成績

よろしくお願いいたします。

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

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

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

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

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

hoshi-takanori

2023/10/05 12:01

そう書くしかないと思います。カラムが増えた時に面倒なのは正規化されてないからでしょうね…。
inup_inup

2023/10/06 02:26

回答ありがとうございました。 参考にさせていただきます。
guest

回答2

0

ベストアンサー

もっと簡潔な書き方があれば知りたいです。

一番簡潔な書き方だと思います。

ただ、Null値は試験を受けなかったという意味があるのではないですか?
Nullを0に置き換えると、0点の場合と区別がつかないですよね。
そうではなくて、0点がNullになっているという事なら、値を正しく補正するべきでしょうね。

投稿2023/10/05 12:35

編集2023/10/05 12:38
sazi

総合スコア25430

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

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

inup_inup

2023/10/06 02:25

ありがとうございました。 たとえありきの疑問ではなかったので表の意味をかんがえていませんでしたが、 確かにNULLと0の違いについては意識しなければなりませんね。
guest

0

簡潔な書き方とは言えませんが、function を定義する方法もあるかと思います。

SQL Fiddle

sql

1CREATE TABLE 成績( 2 学校名 VARCHAR(10), 3 生徒名 VARCHAR(10), 4 試験結果_国語 int, 5 試験結果_数学 int, 6 試験結果_英語 int 7); 8 9INSERT INTO 成績 VALUES('A校', '田中', 90, null, null); 10INSERT INTO 成績 VALUES('A校', '鈴木', 85, 65, 30); 11INSERT INTO 成績 VALUES('B校', '佐藤', null, 30, 45); 12 13CREATE OR REPLACE FUNCTION null_to_zero() 14RETURNS SETOF 成績 AS 15$$ 16DECLARE sql_stmt TEXT; 17BEGIN 18 SELECT FORMAT('SELECT 学校名, 生徒名, %s FROM 成績', 19 STRING_AGG(FORMAT('COALESCE(%s, 0)', COLUMN_NAME), ',')) 20 INTO sql_stmt 21 FROM INFORMATION_SCHEMA.COLUMNS 22 WHERE TABLE_SCHEMA = 'public' AND TABLE_NAME = '成績' AND 23 COLUMN_NAME like '試験結果_%'; 24 25 RETURN QUERY EXECUTE sql_stmt; 26END; 27$$ 28LANGUAGE plpgsql VOLATILE; 29 30-- query 31SELECT * FROM null_to_zero();

投稿2023/10/05 21:14

melian

総合スコア21118

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

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

inup_inup

2023/10/06 02:26

回答ありがとうございました。 参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問