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

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

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

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

Q&A

2回答

2400閲覧

SQLのCASE文のネストについて

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

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

0グッド

0クリップ

投稿2019/08/03 15:51

編集2022/01/12 10:55

postgres sqlを書いています。
どこまでなら構文が通るかを試したところ、以下の構文で引っ掛かりました。
A,Bの2テーブルを跨いでCASE文を作成していますが、以下のCASE文が上手く通りません。
CASE文のネストの仕方は間違っていますでしょうか。

時間の都合でcreate tableなどは用意できないのですが、
目視で判断して下さる方のみお返事をお願い致します。

postgres

1(CASE WHEN (LENGTH(A.date1) = 0) AND (LENGTH(B.date1) = 0) THEN A.date2 2 ELSE 3(CASE WHEN (LENGTH(A.date1) = 0) AND (LENGTH(B.date1) > 0) THEN B.date1 4 ELSE 5(CASE WHEN LENGTH(A.date1) > 0 THEN A.date1 6 END) 7 END) 8 END) 9※Aテーブルのdate1のデータとBテーブルのdate1のデータのlengthが0だったら、 10 Aテーブルのdate2のデータがinsertされる。 11 上記でない場合、 12 Aテーブルのdate1のデータのlengthが0で、Bテーブルのdate1のデータのlengthが0以上あれば、 13 Bテーブルのdate1のデータがinsertされる。 14 上記でない場合、 15 Aテーブルのdate1のデータのlengthが0以上あれば、Aテーブルのdate1のデータがinsertされる。

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

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

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

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

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

gentaro

2019/08/03 16:28

中途半端なクエリであることもそうだけど、テーブル定義とデータの内容がわからないと空振りの原因を特定するなんて無理じゃないかと。(どの条件がマズイのか判断する材料がない)
退会済みユーザー

退会済みユーザー

2019/08/03 16:40

どこがおかしいか当たりがついているので、ピンポイントな質問に変えて再度投稿します。失礼致しました。
gentaro

2019/08/03 17:37

ちゃんとした情報を出さずにコードの断片だけ出してバグ探してくれ、というのはただの作業依頼で、ガイドライン的にもNGだと思います。 時間の都合が云々言うのであれば、いつ回答をもらえるかわからないQ&Aサイトで質問するのではなく、社内でレビューや相談をすればいいのでは。
退会済みユーザー

退会済みユーザー

2019/08/03 17:45

他の方の質問の仕方はどのような感じなのか見て見ましたが、このレベルの質問内容ならば たくさんいらっしゃいました。それに答えて下さる方もいました。 答えて下さる方だけ答えてくれれば良いです。
KOZ6.0

2019/08/04 02:13

呼びました?(^_^;) 自分は結構、回答書いちゃう派ですが、こういうコメント見ると書く気がなくなります。 そんな対応をしていると、結局自分が損をしますよ。> chawa さん
gentaro

2019/08/04 07:24

そもそもが力になってあげられそうな問題だからちゃんと情報出そうぜ、と促す意味でコメント書いてるけど、本人が協力したくないんじゃどうしようもないわな。
Orlofsky

2019/08/04 18:06

KOZ6.0 さん、お呼びたてしてすみません。 わたしがオープン系の仕事を初めた頃は会社できちんと教育体制を用意してくれたのですが、最近はマニュアルを読んでわからないことはググれ、だけで現場に投入するブラック企業が多過ぎです。
guest

回答2

0

質問のCASE式に関して文法的には問題は無いと思いますので、解決の為には情報不足ですね。
データ起因でしょうから、caseの結果を視認できないようなSQLの場合、先ずselectでそのcaseの結果を確認した上で、条件などに組み込むことをお勧めします。

※最終的にはinsertされているようですので、エラーをハンドリングされていない場合は、制約なども関係しているかもしれません。

追記

多分、**length()**での判断ではなくて is Nullで判断じゃないのかなと思います。
空文字とNullが混在しているなら、**coalesce(A.date1, '') = ''**とか。

投稿2019/08/04 04:08

編集2019/08/04 12:52
sazi

総合スコア25138

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

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

sazi

2019/08/05 01:45

修正前の質問では結合条件にcaseを使用していますが、効率的ではありません。 インデックスが使用されるような結合を行ってから、selectでcaseで分岐するようにした方が無難です。
guest

0

SQLの最初が LEFT OUTER JOIN って書き方は何処を参考にしましたか?出典を提示してください。

PostgreSQL SQL 入門

でググっては?

投稿2019/08/03 15:58

Orlofsky

総合スコア16415

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

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

退会済みユーザー

退会済みユーザー

2019/08/03 16:02 編集

質問の冒頭で記載していますが、SQLの途中から記載しているので、LEFT OUTER JOINから記載しています。 SELECT ~ FROM ~までは正しいことは検証済みで、 データが入らなくなったのは(CASE~)の部分を追加してからです。。。
Orlofsky

2019/08/03 16:04

SQLは実行できる形で提示しないと適切なコメントが付くのは難しいでしょう。
退会済みユーザー

退会済みユーザー

2019/08/03 16:10

会社で使用しているもの且つ物凄くSQLが長く複雑なので全文載せることは致しませんでした。 構文ミスなどあまりにとんちんかんな書き方をしているならば見ただけでおかしなところが 分かる方がいらっしゃるかなと思い投稿しました。
Orlofsky

2019/08/03 16:24

掲示板で質問する時はテーブル名や列名を差し支えないものに置換して現象を再現できる最小限のコードを提示するのがルールです。 CREATE TABLEや現行のデータのINSERTさえ提示しないで[空振り]と言われても3年後のchawaさんにも答えられないでしょう。 お金を払ってSQLに詳しい人を雇っては?
退会済みユーザー

退会済みユーザー

2019/08/03 16:38

SQLを作り上げるまでの締め切り期限まで時間もなくお金もないので、ピンポイントな質問に切り替えて質問をし直します。 お手数おかけしました。
Orlofsky

2019/08/03 16:50

質問をピンポイントなものに修正しては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問