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

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

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

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

SQL

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

Q&A

1回答

803閲覧

SQLで複数ソースからデータを読む場合に、片方にしかないcolumnの記載方法

neoz

総合スコア31

PostgreSQL

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

SQL

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

0グッド

0クリップ

投稿2021/07/02 04:29

編集2021/07/02 05:02

SQL(Postgres)で、存在しないcolumnを指定してもエラーにならない記法はありますか?
例えばJSではある変数が存在した場合はAの処理、存在しない場合はBの処理、といった分岐ができると思うのですが、この場合はどのように書くのが適切なのでしょうか?

具体的には、
例えば、月ごとに複数のソースからデータを取得するとします。

5月はcolumn_Aが存在したが、6月にはその名称がcolumn_Bとなった場合、

5月分だけであれば

where column_A = '1'

としていればエラーは発生しませんが、6月分の処理時には

where column_B = '1'

としなければなりませんので
両方合わせて

where column_A = '1' or column_B = '1'

としてみても、エラーになってしまいます。(この場合、column_B does not exist)

どのように記述すればエラーなく実行できるでしょうか?
期間は例えば4,5,6月一括で処理することが前提条件で、切り分けて実行できないです。

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

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

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

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

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

m.ts10806

2021/07/02 04:33

月が変わるとカラムが変わるというのはどういう設計思想なのでしょうか。その時点で運用難では?
m.ts10806

2021/07/02 04:34

また、どういうデータを元にどういう結果を得たいか記載されたほうが良いです。テーブル定義も不明なままでは他者には答えようがありません
neoz

2021/07/02 04:40

具体的にどんなデータを、というイメージではなくて SQLで、存在しないcolumnを指定してもエラーにならない記法があれば良いなと考えています。 例えばJSではある変数が存在した場合はAの処理、存在しない場合はBの処理、といった分岐ができると思うのですが、この場合はどのように書くのが適切なのでしょうか?
m.ts10806

2021/07/02 04:45

SQLとscriptを一緒くたに考えられてる時点でかなり外れてしまうと思います。 それはそれこれはこれです。 DBはものやバージョンで方言があるので想定するDBの種類もないと答えられない部分はありますし、 それこそ、「MySQL 存在しない列の分岐」みたいな検索ワードで探せないこともないのでは。 一般的に、固定値出力でないなら列は存在するものを指定します。
退会済みユーザー

退会済みユーザー

2021/07/02 04:47

正規化して、月の値とその時のデータ、ってふうに分離するよね、ふつーなら。
退会済みユーザー

退会済みユーザー

2021/07/02 04:52

SQLも方言があるので、いちおうデータベースシステム名も表明したほうが親切。
退会済みユーザー

退会済みユーザー

2021/07/02 05:05

今月7月と、1年前や1年後の7月で、そのときもカラム名が変わったりするんでしょうか? なんか、CSVファイルのインポートか何かでテーブルを作っていたりする?
neoz

2021/07/02 05:05

Postgresです、追記しましたmm そうですよね、分岐でも探してみてはいるのですが、まだしっくりこず。。
iruyas

2021/07/02 14:06

>5月はcolumn_Aが存在したが、6月にはその名称がcolumn_Bとなった場合、 「カラム名が変わってもカラムの数や順番は変わらない」とも読めますが そういう理解でよろしいですか?
guest

回答1

0

どんなデータの持ち方なのか、なぞですが。たとえば。

sql

1with 2may as ( 3 select ..., null as column_B from ... 4), 5june as ( 6 select ..., null as column_A from ... 7), 8hoge as ( 9 select * from may union select * from june 10) 11select * from hoge where column_A = '1' or column_B = '1' 12;

しかし
error: syntax error at or near "null"
と言われてしまいました

とのコメントを受けての追記。

sql

1create table xx (id text, name text, column_A text); 2create table yy (id text, name text, column_B text); 3 4insert into xx VALUES 5 ('0501', 'aaa', '0'), 6 ('0502', 'bbb', '1'), 7 ('0503', 'ccc', '0') 8 ; 9 10insert into yy VALUES 11 ('0661', 'ooo', '0'), 12 ('0662', 'ppp', '1'), 13 ('0663', 'qqq', '1') 14 ;

sql

1with 2may as ( 3 select id, name, column_A, null as column_B from xx 4), 5june as ( 6 select id, name, null as column_A, column_B from yy 7), 8hoge as ( 9 select * from may union select * from june 10) 11select * from hoge where column_A = '1' or column_B = '1' 12;
id | name | column_a | column_b ------+------+----------+---------- 0502 | bbb | 1 | 0662 | ppp | | 1 0663 | qqq | | 1 (3 行)

投稿2021/07/02 04:47

編集2021/07/02 12:24
shiketa

総合スコア4061

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

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

neoz

2021/07/02 06:16

ありがとうございます、その手がありましたか! しかし error: syntax error at or near "null" と言われてしまいました。
shiketa

2021/07/02 12:21

ああそうですか、としか言えませんけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問