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

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

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

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

Q&A

解決済

2回答

6704閲覧

WHERE句でのCONCATが効かない

chapp

総合スコア233

MySQL

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

0グッド

0クリップ

投稿2019/05/15 19:18

お世話になっております。お恥ずかしい内容かと思いますが、表題のWHERE句でのCONCATが効かず、その理由がわからずに困っています。

以下がその実際のSQL

SELECT re_property_data.data_no, re_property_data.data_master_no, re_property_data.data_property_name, re_property_data.data_houi, re_property_data.data_madori1, re_property_data.data_madori2, re_property_data.data_genkyou, re_property_data.data_price, re_property_data.data_kanrihi, re_property_data.data_reikin, re_property_data.data_shikikin, re_property_data.data_kyouekihi, re_property_data.data_chuukai_tesuuryou, re_property_data.data_menseki, re_property_data.data_menseki_tani, re_property_data.data_update_date, re_property_data.data_state, re_master_rent.master_no, re_master_rent.master_member_no, re_master_rent.master_cate_m_no, re_master_rent.master_property_name, re_master_rent.master_pr, re_master_rent.master_addr1, re_master_rent.master_addr2, re_master_rent.master_addr3, re_master_rent.master_kouzou, re_master_rent.master_tatemono_kaisuu_chijou, re_master_rent.master_kenchiku_year, re_master_rent.master_kenchiku_month, re_master_rent.master_train1, re_master_rent.master_train_station1, re_master_rent.master_train_station_toho1, re_master_rent.master_train2, re_master_rent.master_train_station2, re_master_rent.master_train_station_toho2, re_master_rent.master_bas, re_master_rent.master_bas_toho, re_master_rent.master_parking, re_master_rent.master_parking_price, re_master_rent.master_img1, re_master_rent.master_update_date, re_master_rent.master_state, re_master_osusume.mo_no, re_master_osusume.mo_master_no, re_master_osusume.mo_osusume_no, zip.group_code, zip.addr2, zip.addr_no FROM re_property_data LEFT JOIN re_master_rent ON re_property_data.data_master_no = re_master_rent.master_no LEFT JOIN zip ON re_master_rent.master_addr2 = zip.addr2 LEFT JOIN re_master_osusume ON re_master_rent.master_no = re_master_osusume.mo_master_no WHERE re_property_data.data_state = '' AND (CONCAT('re_master_rent.master_train_station1','re_master_rent.master_train_station2') = '五反田' OR CONCAT('re_master_rent.master_train_station1','re_master_rent.master_train_station2') = '目黒') AND re_master_rent.master_cate_m_no = '1'

以下はCONCATを使わない内容で、これだと上手く行く

SELECT re_property_data.data_no, re_property_data.data_master_no, re_property_data.data_property_name, re_property_data.data_houi, re_property_data.data_madori1, re_property_data.data_madori2, re_property_data.data_genkyou, re_property_data.data_price, re_property_data.data_kanrihi, re_property_data.data_reikin, re_property_data.data_shikikin, re_property_data.data_kyouekihi, re_property_data.data_chuukai_tesuuryou, re_property_data.data_menseki, re_property_data.data_menseki_tani, re_property_data.data_update_date, re_property_data.data_state, re_master_rent.master_no, re_master_rent.master_member_no, re_master_rent.master_cate_m_no, re_master_rent.master_property_name, re_master_rent.master_pr, re_master_rent.master_addr1, re_master_rent.master_addr2, re_master_rent.master_addr3, re_master_rent.master_kouzou, re_master_rent.master_tatemono_kaisuu_chijou, re_master_rent.master_kenchiku_year, re_master_rent.master_kenchiku_month, re_master_rent.master_train1, re_master_rent.master_train_station1, re_master_rent.master_train_station_toho1, re_master_rent.master_train2, re_master_rent.master_train_station2, re_master_rent.master_train_station_toho2, re_master_rent.master_bas, re_master_rent.master_bas_toho, re_master_rent.master_parking, re_master_rent.master_parking_price, re_master_rent.master_img1, re_master_rent.master_update_date, re_master_rent.master_state, re_master_osusume.mo_no, re_master_osusume.mo_master_no, re_master_osusume.mo_osusume_no, zip.group_code, zip.addr2, zip.addr_no FROM re_property_data LEFT JOIN re_master_rent ON re_property_data.data_master_no = re_master_rent.master_no LEFT JOIN zip ON re_master_rent.master_addr2 = zip.addr2 LEFT JOIN re_master_osusume ON re_master_rent.master_no = re_master_osusume.mo_master_no WHERE re_property_data.data_state = '' AND (re_master_rent.master_train_station1 = '五反田' OR re_master_rent.master_train_station2 = '五反田' OR re_master_rent.master_train_station1 = '目黒' OR re_master_rent.master_train_station2 = '目黒') AND re_master_rent.master_cate_m_no = '1'

両者の違いは、WHERE句の中で、その違う箇所は

(CONCAT('re_master_rent.master_train_station1','re_master_rent.master_train_station2') = '五反田' OR CONCAT('re_master_rent.master_train_station1','re_master_rent.master_train_station2') = '目黒') または (re_master_rent.master_train_station1 = '五反田' OR re_master_rent.master_train_station2 = '五反田' OR re_master_rent.master_train_station1 = '目黒' OR re_master_rent.master_train_station2 = '目黒')

この部分ですが、何かおかしいところはあるのでしょうか?
各カラムには単体の駅名だけが記録されており(インデックス設定などもしていない)、その駅名を検索する内容となってます。

CONCATの方がスマートに記述できるのでこちらを使いたいと思っているのですが、そもそも誤った使い方なのか?それさえ不明でご教示いただければと質問した次第です。

アドバイスのほど、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

SQLではシングルクォートで囲むと文字列として扱われます。

SQL

1AND CONCAT('re_master_rent.master_train_station1','re_master_rent.master_train_station2') = '五反田' 23AND 're_master_rent.master_train_station1re_master_rent.master_train_station2' = '五反田'

として扱われますから、'五反田'のデータは見つかりません。

SQLを横1行に書くのが主義のようですが、見易さは考えた方が良いです。

SQL

1FROM re_property_data rpd -- テーブルの別名を設定 2LEFT JOIN re_master_rent rmr 3ON rep.data_master_no = rmr.master_no 4中略 5WHERE rpd.data_state = '' 6AND (rmr.master_train_station1 in ('五反田', '目黒') 7OR rmr.master_train_station2 in ('五反田', '目黒')) 8AND rmr.master_cate_m_no = '1'

現象を再現できる最小限のコードで質問することも必要です。
CREATE TABLE文も提示するのもマナーです。

投稿2019/05/15 20:35

編集2019/05/15 22:48
Orlofsky

総合スコア16415

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

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

sazi

2019/05/16 00:17

内容がまるっと被ってました。
chapp

2019/05/16 01:56

Orlofskyさん 早々のアドバイスをありがとうございます。 また、一列表示など見易さに欠けていました。(phpで作っているのですが)エディタ上では改行を行っているものの、ブラウザ上では一行になっていました。現状報告の気持ちが優先してのことでしたが、結果見にくいものとなっていました。以降、気をつけます。
guest

0

SQL

1WHERE re_master_rent.master_train_station1 = '五反田' 2 OR re_master_rent.master_train_station2 = '五反田' 3 OR re_master_rent.master_train_station1 = '目黒' 4 OR re_master_rent.master_train_station2 = '目黒'

上記を簡潔にということならInを使用します。

SQL

1WHERE re_master_rent.master_train_station1 In ('五反田', '目黒') 2 OR re_master_rent.master_train_station2 In ('五反田', '目黒')

**CONCAT()**は文字列の結合なので、見当違いです。

Nullじゃないものを優先という事ならCOALESCE()

SQL

1WHERE coalesce(re_master_rent.master_train_station1, re_master_rent.master_train_station2) In ('五反田', '目黒')

投稿2019/05/16 00:16

編集2019/05/16 00:32
sazi

総合スコア25138

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

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

chapp

2019/05/16 02:01

saziさん アドバイスをありがとうございます。 またCOALESCE()を使っての内容にも感謝です。 CONCAT()の知識が曖昧でしたが、今回のご指摘で理解することが出来ました。ありがとうございます。 ただ、感謝に気持ちはお二方共にあるのですが、内容が被っていたとのことで、はじめにアドバイスを下さったOrlofskyさんをベストアンサーとさせていただきます。評価するようで恐縮なのですが・・・ご理解ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問