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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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

解決済

5回答

4479閲覧

Excelを用いてSQL文を作りたいですが、NULLの処理が上手くできません。

lovelydai

総合スコア38

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クリップ

投稿2018/10/01 09:02

編集2018/10/01 09:05

こんにちは、システムのテストを行うため、テストデータをExcelに入力し、CONCATENATEでSQLのInsert文を生成してPostgreSQLのDBに入力する作業をしています。

たとえば、以下のようにテスト用データをExcelに入力します。

|corp_name|description|create_id|create_at|
|:--|:--:|--:|
|A会社|説明あり|1|2018-10-01
|B会社|||NULL

corp_name, descriptionは文字列(text)、create_idは数値(integer),create_atはデータ型(datetime)です。B会社のCreate_atは、NULLを出力させてみたかったので入れてみました。

このテーブルのデータをSQL文に作るため、テーブルの右セールに以下のような数式を作りました。

「1行目(F1セルに入力したとします)」
INSERT INTO test_corps (corp_name,description,create_id,create_at) VALUES (

「2行目以上(Excelの自動完成を利用して複数のデータを作ります。)」
=CONCATENATE($F$1,"‘",A2,"’,‘",A3,"’,",A4,",‘",A5,"’);")
=CONCATENATE($F$1,"‘",B2,"’,‘",B3,"’,",B4,",‘",B5,"’);")
.....(データを追加していく)

すると、結果的にこのようなSQL文ができあがりました。

SQL

1INSERT INTO test_corps (corp_name,description,create_id,create_at) VALUES (‘A会社’,‘説明有り’,1,2018-10-01); 2INSERT INTO test_corps (corp_name,description,create_id,create_at) VALUES (‘B会社’,‘’,,NULL);

このSQL文をDBで実行すると、1番目のSQL文は成功的に処理されますが、2番目は怒られます。調べたところ、データが無い場合はNULLを入れないとダメらしく、Excelのセルが空でデータがない場合はNULLが入るようにしたいです。
しかし、数値は数字そのまま、文字列の値はシングルクォーテーションで囲まないと怒られるし、セルにNULLを入力してみたら、文字列として入力されてしまう(nullではなく、文字列の"null"が値として入ってしまう)のでかなり困っています。

要すると、
Excelにデータを入力してSQL文を作る際に、
1.セルが空白の場合はSQLのValue値にNullを入れたい
2.値が文字列の場合はシングルクォーテーション、数値の場合はそのまま出力したい
です。
上記の例をあげ、欲しいSQL文は、こんな感じです。

SQL

1INSERT INTO test_corps (corp_name,description,create_id,create_at) VALUES (‘A会社’,‘説明有り’,1,2018-10-01); 2INSERT INTO test_corps (corp_name,description,create_id,create_at) VALUES (‘B会社’,null,null,null); 3

どのようにCONCATENATE文を修正すれば、もしくはExcelの関数を使えばいいでしょうか。
教えてください。よろしくお願いします。

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

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

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

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

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

sazi

2018/10/01 09:13

‘Null'が出力されている箇所にはNullという文字が設定されていますか?また、設定されているなら設定しないようにする事は可能ですか?
m.ts10806

2018/10/01 09:20

そもそも‘’ではなく'' (シングルクォート)ではないでしょうか。
sazi

2018/10/01 09:25 編集

>mts10806 さん コードの方では、シングルクォートになってますね
m.ts10806

2018/10/01 10:15

saziさん私の回答のコードのことですか?でしたらそもそもこの質問からコピーして作ってないので間違いなくシングルクォート打ってます。
sazi

2018/10/02 04:38 編集

mts10806 さん いえ、質問のコードです。エクセルに張り付けて確認したところでは、クォートの扱いは問題なさそうでした。
guest

回答5

0

ベストアンサー

シングルクォートで囲むかどうかも含めてIFとORかませれば良いかと。

vba

1IF(OR(A2="",A2="NULL"),"NULL","'"&A2&"'")

出力結果

A2が空、NULL → NULL A2が上記以外 → 'A2の値'

数値かどうかの判断も入れたければIFでもうひとつ分岐かけて
ISNUMBER()でセル値をチェックすれば良いです。

蛇足:
私であればテーブル定義と初期データあわせて1テーブル1シートにしてVBAで全部読ませてCREATEとINSERT作ります。

投稿2018/10/01 09:43

編集2018/10/01 09:45
m.ts10806

総合スコア80765

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

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

lovelydai

2018/10/03 02:04

ありがとうございます。データがながくなると数式に書き込むのが大変になってしまい、VBAソースを探して修正したら、なんとかうまくできました。
guest

0

matherさんのおっしゃるとおりIF分を使うといいと思います。
ただ、式がごちゃごちゃになるので、次のようにしないといろいろつらいです。

  • Sheet1: 元のデータ
  • Sheet2: 加工データ(数式を使って元のデータを加工する)および、それらを連結したもの(一番左の列を利用するとわかりやすいです)
  • Sheet3: SQL式(シート2の連結したものをSQL式に加工します)

投稿2018/10/01 09:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

IFとISBLANKを使ってみてください。

ちなみに
"NULL" ⇒ NULL
"'NULL'" ⇒ 'NULL'

投稿2018/10/01 09:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/10/01 09:22

途中で送信しちゃいました。 ↑に気を付けて書いてみてください。
guest

0

投稿2018/10/01 09:15

mather

総合スコア6753

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

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

0

excelは、あくまでもデータの作成に専念して、そこからprn形式もしくは、CSV形式に変換した後、parlでそのデータを読み込み、sqlを生成するという手もあります。

投稿2018/10/07 14:05

akirafudo6

総合スコア341

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問