LEFT JOIN した際に、該当するレコードがなければ、NULLとしてSELECTされるような動作をしますが、
in() で指定したidのレコードが無い場合、指定した文字列を表示するようなことはできないのでしょうか。
MySQL
1/* こういうテーブルがあって */ 2select * from table ; 3+---------+----------+ 4| id | job_id | 5+---------+----------+ 6| 3624202 | 205445 | 7| 3625705 | 284762 | /* ★ */ 8| 3625726 | 288515 | 9| 3625717 | 315320 | /* ★ */ 10| 3625729 | 439715 | /* ★ */ 11| 3625714 | 562133 | 12+---------+----------+ 13 14/* ★行のレコードのidを in() で指定すると下記のようになりますが、 */ 15select * from tables where id in (3625705, 3625717, 3625729) ; 16+---------+----------+ 17| id | job_id | 18+---------+----------+ 19| 3625705 | 284762 | /* ★ */ 20| 3625717 | 315320 | /* ★ */ 21| 3625729 | 439715 | /* ★ */ 22+---------+----------+ 23 24/* inで指定したレコードが無い場合も、下記のように表示したい */ 25select CASE 26 WHEN id IS NOT NULL THEN id 27 WHEN id IS NULL THEN 'notfound' 28END 29from tables where id in (3625705, 3625717, 3625729) ; 30+---------+----------+ 31| id | job_id | 32+---------+----------+ 33| notfoud | 205445 | 34| 3625705 | 284762 | /* ★ */ 35| notfoud | 288515 | 36| 3625717 | 315320 | /* ★ */ 37| 3625729 | 439715 | /* ★ */ 38| notfoud | 562133 | 39+---------+----------+
↑の条件は解決できましたが、テーブル2つを参照する場合などはどうすればよいでしょうか。
テーブルが2つあり、
JOINするか副問い合わせするかして、
username in ('A', 'D', 'E', 'X', 'Y') という条件に絞った上で、
loginname を ('AA', 'DD', 'EE', 'notfound', 'notfound') と表示させたいのです。
MySQL
1/* login TABLE */ 2+--------+---------+-----------+ 3| id | user_id | loginname | 4+--------+---------+-----------+ 5| 21 | 1 | AA | 6| 22 | 2 | BB | /* ★ */ 7| 23 | 3 | CC | 8| 24 | 4 | DD | /* ★ */ 9| 25 | 5 | EE | /* ★ */ 10| 26 | 6 | FF | 11+--------+---------+--------+ 12 13/* user TABLE */ 14+---------+----------+ 15| id | username | 16+---------+----------+ 17| 1 | A | 18| 2 | B | /* ★ */ 19| 3 | C | 20| 4 | D | /* ★ */ 21| 5 | E | /* ★ */ 22| 6 | F | 23+---------+----------+ 24 25/* usernameが'X', 'Y'のレコードが該当しない */ 26SELECT 27 u.loginname 28FROM 29 login AS l 30LEFT JOIN 31 user AS u ON u.id = l.user_id 32WHERE 33 username in ('A', 'D', 'E', 'X', 'Y') ; 34+-----------+ 35| loginname | 36+-----------+ 37| AA | 38| DD | 39| EE | 40+-----------+ 41 42/* 下記のようなクエリで、'B','C','F'を出さず、'X','Y'も表示したい */ 43/* 案1 */ 44SELECT 45 CASE 46 WHEN u.loginname IS NULL THEN 'notfound' 47 ELSE u.loginname 48 END 49FROM 50 login AS l 51LEFT JOIN 52 user AS u ON u.id = l.user_id 53WHERE 54 username in ('A', 'D', 'E', 'X', 'Y') ; 55+-----------+ 56| loginname | 57+-----------+ 58| AA | 59| DD | 60| EE | 61| notfound | 62| notfound | 63+-----------+ 64 65/* 案2 */ 66SELECT 67 CASE 68 WHEN loginname IS NULL THEN 'notfound' 69 ELSE loginname 70 END 71FROM 72 login 73WHERE 74 user_id in (select id from user where username in ('A', 'D', 'E', 'X', 'Y')) ;
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/10 16:54
2018/10/11 05:17
2018/10/11 15:48