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

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

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

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

4回答

791閲覧

SQLにて()の外の文字を対象にして検索がしたい

katao

総合スコア18

SQL

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/05/19 07:25

DBに
"霞が関駅(東京都)"
"日吉駅(東京都)"
"東京駅"
"浦和駅"
"南浦和駅"
"浦和美園駅"
が入っていたとして

「東京」で検索したら
"東京駅"のみ

「浦和」で検索したら
"浦和駅"
"南浦和駅"
"浦和美園駅"

が出てくるようにしたいのですが、
「()の外の文字を対象にして検索」のようなことは可能でしょうか。
現状は
Station.where("stations.name like ?", "%#{word}%")
で「東京」で検索すると多くの駅が引っかかってしまいます。

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

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

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

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

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

guest

回答4

0

そもそもRDBを利用するのに適さないデータなので、ある程度の不便はあきらめるしかありません。
基本的に例のデータなら()の中は「駅名、地域名」のように別の要素に分離して保存されているべきだと思います。

そういった訳で動作効率は悪くなってしまいますが、例えばPostgresならサブクエリでいったんregexp_replaceを使って括弧(とその中身)を取り除いたデータを作り、そのサブクエリに対してlikeで検索する等の方法で出来なくも無いと思います。

sql

1select * 2from( 3 select regexp_replace(name, '(.*?)', '', 'g') as name 4 from stations 5) data 6where data.name like '%京%'

実際にちゃんと動作するかは分かりませんが、こんなイメージ
mysqlだと正規表現関数が無かったと思うので難しいかも知れません。

投稿2017/05/19 14:03

hirohiro

総合スコア2068

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

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

0

「駅」までの文字ということで良いのであれば(駅名に「駅」が含まれる駅は駄目ですね)
SUBSTR(stations.name, 1, INSTR(stations.name', '駅')) LIKE '%東京%'
最初に出てきた「(」までということであれば、
NVL(SUBSTR(stations.name, 1, INSTR(stations.name, '(') - 1), stations.name) LIKE '%東京%'
でしょうか。

DBが不明なのでOracle想定してます。
適宜読み換えて下さい。

投稿2017/05/19 07:49

編集2017/05/19 07:52
workaholist

総合スコア559

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

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

0

データベースの指定がないのでMySQLで考えてみました。

SQL

1SELECT * FROM stations WHERE SUBSTRING_INDEX(name,'(',1) LIKE '%東京%'

投稿2017/05/19 07:49

ttyp03

総合スコア16998

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

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

0

ベストアンサー

"東京駅(東京都)"が引っかからなくていいなら

駅 LIKE '%東京%' AND NOT(駅 LIKE '(%東京%)')
的な処理でもよいでしょうけど、同条件だと

"(なんたら)東京駅(かんたら)"も除外されてしまいますけどね

投稿2017/05/19 07:42

yambejp

総合スコア114829

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問