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

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

新規登録して質問してみよう
ただいま回答率
85.46%
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回答

365閲覧

正規表現を用いて格納

zelka

総合スコア2

MySQL

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

SQL

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

1グッド

0クリップ

投稿2023/10/16 11:30

編集2023/10/17 06:04

実現したいこと

複数のパラメータを持つデータを各カラムに格納したい

前提

1つのカラムに
12日/18日/1月12日/3月20日/水曜日/金曜日/第一水曜日/第三日曜日のようなデータが入っており、
似たようなカラムが多数あります。
このデータを、n日系/n月n日系/曜日系/第n〇曜日系 のように分けて、横持ちで格納したいです。

[元データ]
event_date
9日/12月10日
9日/水曜日
9日/10月10日/10月11日
第2土曜日/第4土曜日/9日/19日
9日
8日/第4土曜日
8日
8日/12日
8日/12日
8日/12日
8日/12日
8日
8日/16日
8日
8日
8日/土曜日/日曜日
7日/11日/15日/22日/金曜日
7日/11日/22日
7日/第2水曜日
7日
7日/第3日曜日
7日
7日/22日/24日
7日/15日/金曜日
7日/16日/27日

【完成イメージ】
イメージ説明

[イメージ]
カラム①(1つ目のn日):12日 カラム②(2つ目のn日):18日 カラム③(1つ目の〇曜日):水曜日 カラム④(2つ目の〇曜日):金曜日 カラム⑤(1つの第n〇曜日):第一水曜日 カラム⑥(2つ目の第n〇曜日):第三日曜日

該当のソースコード

MySQL

1### 試したこと 2SELECT 3 -- 毎日~日をday_に格納 4 CASE 5 WHEN event_date NOT LIKE '%[0-9]月%' AND event_date NOT LIKE '%[0-9]月[0-9]+日%' THEN REGEXP_SUBSTR(event_date, '([0-9]+日)') 6 ELSE NULL 7 END AS day_1, 8 CASE 9 WHEN event_date NOT LIKE '%[0-9]月%' AND event_date NOT LIKE '%[0-9]月[0-9]+日%' THEN REGEXP_SUBSTR(event_date, '([0-9]+日)', 1, 2) 10 ELSE NULL 11 END AS day_2, 12 -- 特定の日付(1月23日等)をmonth_day_に格納 13 REGEXP_SUBSTR(event_date, '[0-9]+月[0-9]+日') AS month_day, 14 REGEXP_SUBSTR(event_date, '[0-9]+月[0-9]+日',1 ,2) AS month_day_2, 15 -- 曜日をday_week_に格納 16 CASE 17 WHEN event_date NOT LIKE '%第%' THEN REGEXP_SUBSTR(event_date, '([月火水木金土日]曜日)') 18 ELSE NULL 19 END AS day_week_1, 20 CASE 21 WHEN event_date NOT LIKE '%第%' THEN REGEXP_SUBSTR(event_date, '([月火水木金土日]曜日)',1 ,2) 22 ELSE NULL 23 END AS day_week_2, 24 -- 特定の曜日(第n〇曜日/を最終〇曜日)をsp_day_week_に格納 25 REGEXP_SUBSTR(event_date, '([第]+[12345一二三四五]+[月火水木金土日]+曜日)') AS sp_day_week_1, 26 REGEXP_SUBSTR(event_date, '([第]+[12345一二三四五]+[月火水木金土日]+曜日)',1 ,2) AS sp_day_week_2 27FROM A1

わからないこと

上記クエリではx月y日のデータについて、y日の部分がday_にも格納されてしまいます。
day_にはx月y日のような月日のデータは格納せずに、z日のような日付のみのデータが格納されるようにしたいです。また、x月y日のような月日のデータはmonth_dayに格納したいです。。

初級者のため、前提が間違っているかもしれないので、その際にはコメントをお願い致します。

neko_the_shadowを押しています

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

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

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

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

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

yambejp

2023/10/17 00:16

テーブルのサンプルとほしい結果を例示ください
yambejp

2023/10/17 05:57

サンプルデータは画像と同等のものをテキストでも付加してください
guest

回答2

0

ベストアンサー

適当ですが・・・

SQL

1 2create table tbl(id int primary key auto_increment, 3event_date text 4); 5 6insert into tbl(event_date) values 7('9日/12月10日'), 8('9日/水曜日'), 9('9日/10月10日/10月11日'), 10('第2土曜日/第4土曜日/9日/19日'), 11('9日'), 12('8日/第4土曜日'), 13('8日'), 14('8日/12日'), 15('8日/12日'), 16('8日/12日'), 17('8日/12日'), 18('8日'), 19('8日/16日'), 20('8日'), 21('8日'), 22('8日/土曜日/日曜日'), 23('7日/11日/15日/22日/金曜日'), 24('7日/11日/22日'), 25('7日/第2水曜日'), 26('7日'), 27('7日/第3日曜日'), 28('7日'), 29('7日/22日/24日'), 30('7日/15日/金曜日'), 31('7日/16日/27日'); 32 33 34SELECT id,event_date, 35regexp_substr(event_date,'[0-9]+日') as day1, 36regexp_substr(event_date,'[0-9]+日',1,2) as day2, 37regexp_substr(event_date,'[0-9]+日',1,3) as day3, 38regexp_substr(event_date,'[0-9]+日',1,4) as day4, 39regexp_substr(event_date,'[0-9]+月[0-9]+日') as month1, 40regexp_substr(event_date,'[0-9]+月[0-9]+日',1,2) as month2, 41substr(regexp_substr(event_date,'/.曜日'),2) as week1, 42substr(regexp_substr(event_date,'/.曜日',1,2),2) as week2, 43regexp_substr(event_date,'第[0-9].曜日') as sp1, 44regexp_substr(event_date,'第[0-9].曜日',1,2) as sp2 45FROM tbl

調整版

SQL

1SELECT id,event_date, 2coalesce(regexp_substr(event_date,'^[0-9]+日|(!月)[0-9]+日'),substr(regexp_substr(event_date,'/[0-9]+日'),2)) as day1, 3substr(regexp_substr(event_date,'(^|/)[0-9]+日',1,2),2) as day2, 4substr(regexp_substr(event_date,'(^|/)[0-9]+日',1,3),2) as day3, 5substr(regexp_substr(event_date,'(^|/)[0-9]+日',1,4),2) as day4, 6regexp_substr(event_date,'[0-9]+月[0-9]+日') as month1, 7regexp_substr(event_date,'[0-9]+月[0-9]+日',1,2) as month2, 8substr(regexp_substr(event_date,'/.曜日'),2) as week1, 9substr(regexp_substr(event_date,'/.曜日',1,2),2) as week2, 10regexp_substr(event_date,'第[0-9].曜日') as sp1, 11regexp_substr(event_date,'第[0-9].曜日',1,2) as sp2 12FROM tbl

投稿2023/10/17 06:42

編集2023/10/17 07:27
yambejp

総合スコア115010

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

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

zelka

2023/10/17 06:56

ご回答ありがとうございます! 曜日の方はうまくいったのですが、日付の方がまだ出来なかったです。 ('9日/10月10日/10月11日')の場合、day1に9日、day2~4はnull、month1に10月10日、month2に10月11日が入るようにするのは可能でしょうか・・・? 頂いたクエリだと('9日/10月10日/10月11日')の際にday2に10日、day3に11日が入ったのですが、入らないようにしたいです。
yambejp

2023/10/17 07:27

調整版あげました。どうでしょう?
zelka

2023/10/17 07:45

問題ありませんでした! 誠にありがとうございました!
zelka

2023/10/17 08:08 編集

誠に申し訳ございません。。。 1日/7日/15日/25日のようなデータの場合、なぜか7日しかDAY1に格納されず、DAY2以降が空カラムになってしまいます。。。 n日が複数あるとおこってしまうのですが、解消方法はありますでしょうか? #追記 先頭にあるデータが格納されていないみたいです・・・ 木曜日/25日みたいなデータだと25日は正しく格納されますが、木曜日が格納されないです。。。
guest

0

やりかたはいろいろあると思いますが、REPLACE関数を使ってREGEXP_SUBSTRの結果から「日」という字を削除するのはどうでしょうか。

SQL

1 REPLACE(REGEXP_SUBSTR(event_date, '([0-9]+日)'), '日', '')

2023-10-17 追記

質問を誤解していたようです。申し訳ありません。たとえば以下のようなSQLはどうでしょうか?

SQL

1SELECT 2 event_date, 3 SUBSTR(REGEXP_SUBSTR(CONCAT('/', event_date), '/[0-9]+日', 1, 1), 2) AS day_1, 4 SUBSTR(REGEXP_SUBSTR(CONCAT('/', event_date), '/[0-9]+日', 1, 2), 2) AS day_2, 5 SUBSTR(REGEXP_SUBSTR(CONCAT('/', event_date), '/[0-9]+日', 1, 3), 2) AS day_3, 6 SUBSTR(REGEXP_SUBSTR(CONCAT('/', event_date), '/[0-9]+日', 1, 4), 2) AS day_4, 7 SUBSTR(REGEXP_SUBSTR(CONCAT('/', event_date), '/[0-9]+月[0-9]+日', 1, 1), 2) AS month_day_1, 8 SUBSTR(REGEXP_SUBSTR(CONCAT('/', event_date), '/[0-9]+月[0-9]+日', 1, 2), 2) AS month_day_2, 9 SUBSTR(REGEXP_SUBSTR(CONCAT('/', event_date), '/[月火水木金土日]曜日', 1, 1), 2) AS day_week_1, 10 SUBSTR(REGEXP_SUBSTR(CONCAT('/', event_date), '/[月火水木金土日]曜日', 1, 2), 2) AS day_week_2, 11 SUBSTR(REGEXP_SUBSTR(CONCAT('/', event_date), '/[第]+[12345一二三四五]+[月火水木金土日]+曜日', 1, 1), 2) AS sp_day_week_1, 12 SUBSTR(REGEXP_SUBSTR(CONCAT('/', event_date), '/[第]+[12345一二三四五]+[月火水木金土日]+曜日', 1, 2), 2) AS sp_day_week_2 13FROM A1

処理のイメージは以下の通りです。

  1. 7日/11日/15日/22日/金曜日というデータを/7日/11日/15日/22日/金曜日に変換する
  2. 変化したデータから正規表現を利用して/7日/金曜日というデータを取り出す
  3. 取り出したデータの先頭にある/を削除する

投稿2023/10/16 12:56

編集2023/10/17 08:07
neko_the_shadow

総合スコア2273

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

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

zelka

2023/10/17 05:47

日を消すと曜日の「日」も消えて微妙だったので難しそうです・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問