🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL

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

Q&A

解決済

4回答

55460閲覧

SQLで指定文字の前を抽出したい

aimi

総合スコア11

SQL

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

0グッド

2クリップ

投稿2017/05/22 01:23

###前提・実現したいこと
SQLで一部文字列を抽出する方法はありますか?
例:メールアドレスからの「@」の前を抽出
例:埼玉県、神奈川県、千葉県…等のリストから「県」の前を抽出

初めの○文字等、決まった文字数を一律で抽出する方法はわかるのですが、
上記のような指定文字の前の部分を抽出する方法はありますでしょうか。

恐れ入りますが、どうぞよろしくお願い致します。

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft SQL Server Management Studioを使用

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

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

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

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

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

guest

回答4

0

ベストアンサー

都道府県の場合だと県を含むとは限らないので こんな感じで

SQL

1SELECT LEFT(都道府県, CASE WHEN CHARINDEX('県', 都道府県) <> 0 THEN CHARINDEX('県', 都道府県) - 1 ELSE 0 END) AS 県名

CHARINDEX の代わりに PATINDEX を使うと後方一致や前方一致も出来ます。

投稿2017/05/22 02:12

hihijiji

総合スコア4152

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

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

aimi

2017/05/22 05:04

このやり方ですとメールアドレスの方もうまくいきました! ありがとうございます!!!
guest

0

試してませんが、こんな感じでできないでしょうか。
必ず@が含まれている前提ですが。

SQL

1SELECT SUBSTRING(mail,1,CHARINDEX(mail,'@')-1)

NULLと@を含まない場合の対策版

SQL

1SELECT 2 CASE mail 3 WHEN NULL THEN 4 NULL 5 ELSE 6 SUBSTRING(mail,1,CASE CHARINDEX('@',mail) WHEN 0 THEN LEN(mail) ELSE CHARINDEX('@',mail)-1 END) 7 END;

投稿2017/05/22 01:37

編集2017/05/22 05:14
ttyp03

総合スコア17000

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

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

aimi

2017/05/22 01:52

ご回答ありがとうございます。 必ず@は含まれているもので試してみましたが、エラーになってしまいました。 Invalid length parameter passed to the LEFT or SUBSTRING function.
ttyp03

2017/05/22 01:55

すみません。こうかも。 CHARINDEXのパラメーターが逆でした。 SELECT SUBSTRING(mail,1,CHARINDEX('@',mail)-1)
aimi

2017/05/22 04:52

ありがとうございます。 一瞬回り上手くいきそうだったのですが、3秒ほどすると先ほどと同様のエラーが出てしましいました。。
ttyp03

2017/05/22 04:55

3秒ってのがよくわかりませんが、@を含んでないデータだったのでは。 なんか対策考えてみます。
aimi

2017/05/22 05:04

なるほど、ちょっと調べられていないですが、一部@を含んでいないデータが混ざっている可能性もあります。(NULL等)ありがとうございます。
ttyp03

2017/05/22 05:15

NULLまたは@を含んでいない場合の対策版を追記しておきました。 ちょっと長ったらしいですが・・・。 参考まで。
aimi

2017/05/26 05:29

返信が遅れてしまい申し訳ありません。 CASEで条件分岐すればよいのですね!こちらうまく動きました。ありがとうございます!!
guest

0

Oracleで@が必ずあるのが前提で、

SQL

1SELECT SUBSTR(MAIL_ADDR, 1, INSTR(MAIL_ADDR, '@') -1) FROM 2(SELECT 'abc123@amail.com' AS MAIL_ADDR FROM DUAL) ;

SQLはデータベースによって方言がありますから、お使いのデータベースを明記した方が良いですよ。

投稿2017/05/22 06:59

Orlofsky

総合スコア16417

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

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

aimi

2017/05/26 05:38

ご回答ありがとうございます。 補足情報に書いてあったのですが、Microsoftでした。 Oracleを使用する機会があればこちらも試してみたいと思います。ありがとうございます!
guest

0

mysqlとpostgresではpositionは使える様です

sql

1select substr('hoge@abc.co.jp',1,position('@' in 'hoge@abc.co.jp')-1); 2 3 4select substr('埼玉県ほげほげ市ほげほげ町',1,position('県' in '埼玉県ほげほげ市ほげほげ町')-1);

投稿2017/05/22 02:05

編集2017/05/22 02:09
A.Ichi

総合スコア4070

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

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

aimi

2017/05/22 04:53

ご回答ありがとうございます。 このようなやり方もあるのですね。 ダメ元で回してみましたが、Microsoftのなので使えませんでした。
A.Ichi

2017/05/22 05:04

SQLServerでしたか、お役に立てず失礼いたしました。 SELECT SUBSTRING('hoge@abc.co.jp',1,CHARINDEX('@', 'hoge@abc.co.jp')-1);
aimi

2017/05/26 05:47

いえいえとんでもないです。 Microsoftでも使えるものを教えていだきありがとうございます。 こちら使用させて頂きますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問