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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

4回答

1500閲覧

MySQLにて、SELECT文を実行した際に、該当するデータがない場合にnullを取得したい。

lerever

総合スコア9

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/08/28 02:38

編集2018/08/28 02:47

前提・実現したいこと

Androidからネットワーク上のサーバーに設置したphpファイルにアクセスし、
phpファイルから同サーバー内で動作するMySQLに対してSQL文を実行します。
質問内容はのSQL文の部分で、指定したカラムに該当するデータがない場合、その部分のみnullが入った状態で
結果を取得したいのですが、なかなか該当する記述が見当たらない為、質問させていただきました。

該当のソースコード

testテーブル +--------+-------+-------+ | a | b | c | +--------+-------+-------+ | 1 | AAA | WWW | | 2 | BBB | YYY | | 3 | CCC | ZZZ | +--------+-------+-------+

MySQL

1SELECT a,b FROM test WHERE c='WWW'; 2SELECT a,b FROM test WHERE c='XXX'; 3SELECT a,b FROM test WHERE c='ZZZ';
こんな答えが欲しいです。 +--------+-------+ | a | b | +--------+-------+ | 1 | AAA | | null | null | | 3 | CCC | +--------+-------+

SQL文を何か改造することで、上記のような結果を得られるものなのでしょうか。

よろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

同じテーブル同士を LEFT JOIN すれば、一応結果は得られます。
レスポンスは酷いことになるかもしれませんが……。

sql

1select 2 t2.a, 3 t2.b 4from 5 test t1 6 left join test t2 on t1.a=t2.a and t1.b=t2.b and t1.c=t2.c 7 and t1.c in('WWW','XXX','ZZZ') 8order by 9 t1.a;

動くサンプル:
http://sqlfiddle.com/#!9/4b8179/6

投稿2018/08/28 02:58

alg

総合スコア2019

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

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

lerever

2018/08/28 03:07

alg様 ご回答ありがとうございます。 確かに結果は取得できますが無理やり感も強く…。 しかしながら当方からの少ない情報に対し、 しっかりと求めている結果を取得することが出来ました。 「こんな方法があるんだなー。」と大変勉強になりました。 精進します。 ありがとうございました。
sazi

2018/08/28 06:37

>lereverさん algさんも言われているように、結合するならインデックスが無い状態だとレスポンスは良くないですよ。 やるならcaseとの性能佐野比較をしてから実装したほうが良いですよ。
guest

0

Where句の文字群を基準とするなら、そちらをfrom句にまとめてしまい、そこに対してLEFT JOINする方法はいかがでしょうか。

sql

1select 2 test.a, 3 test.b 4from ( 5 select 'WWW' as a_keyword, 1 as sort_no 6 union select 'XXX', 2 7 union select 'ZZZ', 3 8) as t1 9left join test 10 on t1.a_keyword = test.c 11order by t1.sort_no 12;

これの手書きは面倒だろうと思いますので、なんらかのツールでテキスト生成することになると思います。

投稿2018/08/28 05:19

編集2018/08/28 06:40
Yajamon

総合スコア88

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

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

Yajamon

2018/08/28 05:19

t1の生成でselect unionを使っていますが、このスカラー値から1列の集合を作る部分サクッと書ける手段がほしいですね。
lerever

2018/08/28 06:14

Yajamon様 ご回答いただきありがとうございます。 しかしながら此方の環境ですと、 求めていたデータ(a,bともにNULL)が取得できないようであります。 此方の知識不足のせいであったならば申し訳ないのですが…。
Yajamon

2018/08/28 06:37

a, bともにNullであるレコードが a=1とa=3の間に欲しいということでしょうか? であればちょっと手直しします。
lerever

2018/08/28 07:05

Yajamon様 修正いただきありがとうございます。 しかしながら修正いただいたコードでも求めている内容が取得できませんでした。 (テスト用にa=4,b=ddd,c=XXXという行を追加しております。) testテーブルはどんどんデータが増えていく為、それをイメージして追加してみたところ、 a b 1 aaa 4 ddd 3 ccc となってしまいました。 そこで、差し当たって現状は他の回答者様にいただいた回答を用いて トライしてみようと思っております。 また、何かありましたら質問させていただきます。 よろしくお願いします。
Yajamon

2018/08/28 07:11

c=XXXのデータを追加してしまっては、質問の前提が崩れてしまってます…
lerever

2018/08/28 07:12

Yajamon様 申し訳ありません。 よく考えれば上記テストはまったく意味のないテストでありました。 (c=XXXが存在しない時にa,bをNULLとして取得したいわけですからc=XXXを追加すれば  上記の答えになるのは明確でした。) 大変失礼しました。 しかしながらまずは皆さんにいただいた回答を用いて 自分でトライしてみようと思っております旨は変わりませんので、 また何かありましたら、その時はよろしくお願いします。
guest

0

aはキーっぽいのでNullにはしないんじゃないのかな?

SQL

1select a, case when c in ('WWW','XXX','ZZZ') then b end as b 2from testテーブル 3order by a

投稿2018/08/28 02:56

sazi

総合スコア25173

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

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

lerever

2018/08/28 03:05

sazi様 ご回答ありがとうございます。 おっしゃる通り雰囲気がaの雰囲気がキーっぽい状態でありましたが、 今回はあくまでサンプルデータだった為、中身に深い意味はありませんでした。 しかしながら求めている結果は取得できました。 「こんな方法があるんだなー。」と大変勉強になりました。 精進します。 ありがとうございました。
yambejp

2018/08/28 03:55

aがnullになっていないので命題通りではないですよね SQLにはレコードの順番という概念がないので 命題の順番でnullを挟んで出力するのは無理があります
sazi

2018/08/28 05:03

> yambejpさん 命題通りではないです。最近は老婆心というか後出しの方が先に気になって回答してしまいます。 結局順序に関するものは他にあるということで、類似項目もCASEで置換するということで理解していただければと思います。
lerever

2018/08/28 06:18

yambejp様 sazi様 ご指摘・追記いただきありがとうございます。 今回求めていた内容はa,bともにNULLの行が含まれているデータであった為、 回答いただいたコードは適当ではないようでした。(aがNULLではない。) しかしながら上にも書きましたとおり、 自分が持ちえない知識の獲得に繋がりました。 (お恥ずかしながらCASE文の存在を知りませんで…) 担当者が退職し、付け焼刃の状態であることは自覚しておりますが、 これからも精進してまいります。 ありがとうございました。
sazi

2018/08/28 06:30

aも同様に応用するだけですよ。対象の項目を変えるだけ。pointはcaseでの判断ですから。
guest

0

SQL

1SELECT 2 CASE WHEN c = 'WWW' or c = 'ZZZ' THEN a ELSE null end as a, 3 CASE WHEN c = 'WWW' or c = 'ZZZ' THEN b ELSE null end as b 4FROM 5 DatabaseName.TableName;

投稿2018/08/28 02:48

編集2018/08/28 03:09
kunai

総合スコア5405

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

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

lerever

2018/08/28 03:04

kunai様 ご回答いただきありがとうございます。 後学者の為に記載しておきますと、 SQL文中の as b 後の , を削除したところ、 無事に求めているデータを取得することが出来ました。 ありがとうございました。
sazi

2018/08/28 03:06

え?C='XXX'の時もNullになっちゃいますよ?
lerever

2018/08/28 03:13

sazi様 ご指摘ありがとうございます。 確かに結果としては正しいように見えましたが、 おっしゃる通りC='XXX'の時もNULLになってしまうようでした。 当方の確認不足で混乱させてしまい、申し訳ありませんでした。 業務使用する直前で止めていただいて助かりました…。 もう少し慎重に進めます…。
kunai

2018/08/28 04:02

要件が違っていたんですかね? 「Cが○○だったらnull」の「〇〇」の部分にXXXが含まれていたということですか? であれば、 case when c no in ('WWW', 'ZZZ', 'XXX') then null else a as a とかで対応できますが。
lerever

2018/08/28 06:22

kunai様 此方の知識不足により、不快な思いをさせてしまって申し訳ありませんでした。 少し時間をかけて調査しましたところ、今回求めている形としましては LEFT JOINを使う方法が適しているようでありました。 (周辺ソフトとの兼ね合いがあるようでして…) しかしながら自分が持ちえない知識の獲得に繋がりました。 (お恥ずかしながらCASE文の存在を知りませんで…) 担当者が退職し、付け焼刃の状態であることは自覚しておりますが、 これからも精進してまいります。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問