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

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

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

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

SQL

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

Q&A

5回答

1299閲覧

MySQLでのSELECTで名前変更したものをを検索する方法。

larara

総合スコア11

MySQL

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

SQL

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

0グッド

0クリップ

投稿2020/04/08 00:59

編集2020/04/08 01:34

前提・実現したいこと

SQLでSELECTで名前を変更した値を検索したい。

該当のソースコード

SQL

1SELECT 2 CASE 3 WHEN gender = '女' THEN 0 4 WHEN gender = '男' THEN 1 5 WHEN gender = null THEN 2 6 ELSE 99 7 END as gender1 8 FROM users where gender1 = 2 9 10SELECT 11 IF( 12 gender = null, gender = 2, 13 gender 14) gender1 15FROM users 16where gender1 = 2; 17 18 19create table users 20( 21 id int auto_increment 22 primary key, 23 gender varchar(10) null 24); 25 26 27INSERT INTO users (gender) VALUES ('男'); 28INSERT INTO users (gender) VALUES ('男'); 29INSERT INTO users (gender) VALUES ('男'); 30INSERT INTO users (gender) VALUES ('男'); 31INSERT INTO users (gender) VALUES ('男'); 32INSERT INTO users (gender) VALUES ('女'); 33INSERT INTO users (gender) VALUES ('女'); 34INSERT INTO users (gender) VALUES ('女'); 35INSERT INTO users (gender) VALUES ('女'); 36INSERT INTO users (gender) VALUES ('女'); 37INSERT INTO users (gender) VALUES (null); 38INSERT INTO users (gender) VALUES (null); 39INSERT INTO users (gender) VALUES (null); 40INSERT INTO users (gender) VALUES (null); 41INSERT INTO users (gender) VALUES (null);

期待値

idgender
11null
12null
13null
14null
15null

ご教授ください。

追記

SELECT gender as g1 FROM users where g1 is null;

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/08 01:06

DB は SQL Server, MySQL, Oracle, その他何でしょうか? SQL には DB による方言のようなものがあって DB によって異なる場合がありますので書くようにしてください。 あと、期待する結果はどういうもので、現状どうなっているのかも書いてください。
larara

2020/04/08 01:09

申し訳ありません、MySQLになります。
kaina

2020/04/08 01:10

usersテーブルのgenderに入っている値は男 or 女 or nullのだけど where条件ではgender = 2とか値で検索したいってこと?
larara

2020/04/08 01:16

はいそう言うことです。
guest

回答5

0

gender を編集して変換した物との条件にしたいなら、SQLをネストさせます。

SQL

1select * from ( 2 SELECT * 3 , CASE 4 WHEN gender = '女' THEN 0 5 WHEN gender = '男' THEN 1 6 WHEN gender = null THEN 2 7 ELSE 99 8 END as gender1 9 FROM users 10) t1 11where gender1 = 2

もう一つは入力の条件を変換する事です。
こちらの方が比較対象を変換しない分高速になる可能性があります。

SQL

1set @gender=2; 2select * from user 3where gender = case @gender when 0 then '女' when 1 then '男' end 4 0r (gender is null and @gender=2) 5 0r @gender=99 6;

投稿2020/04/08 02:55

編集2020/04/08 03:53
sazi

総合スコア25327

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

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

0

テーブルに格納されている値はあくまでNULLです。
CASE THENは出力する値を指定しているのみであり、
テーブル内の値を変更しているわけではありません。

どうしてもNULLではなく、2で検索したいのであれば、テーブル内に別カラムを追加し
値を格納するようにしてください。

投稿2020/04/08 01:38

kaina

総合スコア418

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

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

0

SQLには実行順序があります。
上から順番に実行されます
0. FROM
0. JOIN
0. WHERE
0. GROUP BY
0. HAVING
0. SELECT
0. DISTINCT
0. ORDER BY
0. LIMIT
なので
「usersテーブルのgenderに入っている値は男 or 女 or nullだけど
where条件ではgender = 2とか値で検索したい」というのは難しいのではないでしょうか。

投稿2020/04/08 01:38

June666

総合スコア290

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

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

0

想像ですが、WHERE 句で gender = NULL とかしても期待する結果が得られないから困っているような気がします。

そうであれば、WHERE gender IS NULL とすれば解決するのではないでしょうか?

MySQLで値がNULLかどうかを判定する(is null や is not null の使い方)
https://26gram.com/mysql-is-null

想像が違ったらすみません。その場合はもう少し詳しく何がしたいのか書いてください。

【追記】

質問の追記のコード、

SELECT gender as g1 FROM users where g1 is null;

は Unknown column 'g1' in 'where clause' というエラーで動かないと思いますが、それが動くようにできればいいということなら、以下のようにしてはいかがですか?

イメージ説明

投稿2020/04/08 01:27

編集2020/04/08 02:31
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

larara

2020/04/08 01:29

あくまでも上のnullは参考値であり、本来やりたいことはSELECTで変更した値を検索したいです。
退会済みユーザー

退会済みユーザー

2020/04/08 01:33

gender = NULL は意味がないということは理解されてますか? 質問のソースコードで gender = null がいくつか出てきますが、それを gender IS NULL に書き換えたらどうなりますか?
larara

2020/04/08 01:34

タイトルか変更いたしました。 本来やりたいことはASした値を取得する方法になります。
退会済みユーザー

退会済みユーザー

2020/04/08 01:39

上のコメントに答えてください。そうしてもらわないと話がかみ合わなくなります。
guest

0

sqlにおいてnullは特別な値なので等号では合致しません
カラム is nullで検索してください

投稿2020/04/08 01:26

yambejp

総合スコア116724

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

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

larara

2020/04/08 01:29

あくまでも上のnullは参考値であり、本来やりたいことはSELECTで変更した値を検索したいです。
yambejp

2020/04/08 01:41

とりあえず SELECT * FROM users WHERE CASE WHEN gender = '女' THEN 0 WHEN gender = '男' THEN 1 WHEN gender is null THEN 2 ELSE 99 END = 2
yambejp

2020/04/08 01:43

わざわざ変換してから付け合せをして、 表示するのは元データっていうのはいかにも非効率な感じが否めません
yambejp

2020/04/08 04:11 編集

ちなみにお勧めはしないですが、mysqlはgroup byしなくても havingできてしまう仕様があります SELECT *,CASE WHEN gender = '女' THEN 0 WHEN gender = '男' THEN 1 WHEN gender is null THEN 2 ELSE 99 END as gender_num FROM users HAVING gender_num= 2
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問