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

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

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

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

SQL

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

Q&A

解決済

2回答

33124閲覧

SQL構文でlikeとinと不等式を組み合わせたような構文

urdapple

総合スコア83

MySQL

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

SQL

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

0グッド

0クリップ

投稿2015/11/10 10:17

編集2015/11/10 10:42

MySQLで、あるカラム(カラム名は「floorplan」とします)に以下のデータが入っていたとします。

1K,1K,1K,2DK,3DK,3DK,3LDK,3LDK,4DK,4LDK,4LDK,5DK,5LDK,6DK,6LDK,・・・

入る文字列は「数値」+(「L」or「DK」or「LDK」)の組み合わせのみで、数値は1<=x<=10です。
重複ありです。

この中から4LDK以上をselectする構文が浮かびません。
4DKや4Kは含まず、且つ5部屋以上の場合はL,DK,LDK全て抽出したいです。

単純に考えるなら

sql

1select * from テーブル名 where 2floorplan in ("4LDK", "5L", "5DK", "5LDK" /* ・・・ 可能性のある全て */);

もしくは

sql

1select * from テーブル名 where 2floorplan = "4LDK" or 3floorplan like "5%" or 4floorplan like "6%" or 5floorplan like "7%" or /* 10まで */;

ただ、これではどちらにせよ余りにも冗長なので、もっと簡単でスマートなlikeとinと不等式を組み合わせたような方法があったら教えて下さい。

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

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

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

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

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

guest

回答2

0

ベストアンサー

あまりスマートとは言えませんが、

sql

1SELECT * FROM テーブル名 WHERE floorplan LIKE '%4LDK%' OR floorplan REGEXP('(5|6|7|8|9|10)(L|DK|LDK)');

私もanonymouskawa様と同じく、テーブル設計の見直しをお勧めします。

投稿2015/11/10 10:43

KiyoshiMotoki

総合スコア4791

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

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

urdapple

2015/11/10 10:50

あ、なるほど!正規表現使えましたね!! やりたいことは構文的にもわかりやすいので、今回はこれで行こうと思います! ありがとうございましたm(_ _)m
anonymouskawa

2015/11/10 10:51

あっ、 入る文字列は「数値」+(「L」or「DK」or「LDK」)の組み合わせのみで、数値は1<=x<=10です。 重複ありです。 これ見落としてました。
KiyoshiMotoki

2015/11/10 10:56

こういうSQL文を考えるのは楽しいですが、業務ではやりたくないですねw
guest

0

あんまりやりたくないけど

SQL

1select * from test where floorplan >= '4LDK';

投稿2015/11/10 10:25

anonymouskawa

総合スコア856

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

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

anonymouskawa

2015/11/10 10:37 編集

この場合、room_count(部屋数)みたいなのとroom_layout(部屋割り)みたいなカラムに分けた方がいいかもしれないですね。 どうあがいても10部屋以上のものが取れなくなるので。
urdapple

2015/11/10 10:39

早速お答えありがとうございます。 そうなんです。 本当なら分けるべきだったんでしょうね_| ̄|○ ちなみに提示していただいた案は考えたんですけれど、ASCII文字列的にひっかかるので10~が引っかからなくなってしまうんですよね・・・ 10だけはorで繋いで or floorplan like '10%' とするしかないんでしょうかね(´・ω・)
anonymouskawa

2015/11/10 10:47 編集

11部屋以上にも対応するとなると、 select * from test a1 where a1.floorplan >= '4LDK' or (SUBSTRING(a1.floorplan, 2,1) <= '9' and SUBSTRING(a1.floorplan, 1,1) >= '1') ゴリ押しでいいなら…こんな感じに…
urdapple

2015/11/10 11:27

おそらく、速度的にはSUBSTRINGの方が早そうなんですが、整備性を考えてやりたいことがひと目でわかる正規表現案を使わせていただきました。 次からはDB設計でもう少し煮詰めてからスタートしないとダメですね( ̄▽ ̄;) ありがとうございましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問