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

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

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

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Zabbix

モニタリングツール

Q&A

解決済

3回答

824閲覧

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

ITOMO5963

総合スコア98

MySQL

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Zabbix

モニタリングツール

0グッド

0クリップ

投稿2022/03/04 02:57

編集2022/03/04 05:38

実現したいこと

ZabbixのアイテムのヒストリをSQLで出力させてます。以下の条件のもと文字列を抽出する方法はありますか?
REGEXP_REPLACEをつかいましたが、理想の結果になりません。
・「@」の前を抽出。
・「@」が無い場合は、すべて抽出。
恐れ入りますが、ご教示お願いします。

[バージョン]
MariaDB:10.5.10
zabbix:5.0

sql

1SELECT zabbix.history_str.value AS 'address' 2FROM 3 zabbix.history_str 4 LEFT JOIN zabbix.items USING(itemid) 5WHERE from_unixtime(zabbix.history_str.clock) BETWEEN '2022-01-02T17:46' AND '2022-03-05T18:46'; 6 7 8#出力結果 9+--------------------------------------------------------------------------------------------+ 10|address | 11+--------------------------------------------------------------------------------------------+ 12| 123@gmail.com|google|メール|123支店 | 13| 456@yahoo.co.jp|yahoo|メール|456支店 | 14| 789|google|| | 15| cat@gmail.com|google|メール|cat支店 | 16| dog@yahoo.co.jp|yahoo|メール|dog支店 | 17| tiger|yahoo|| | 18+--------------------------------------------------------------------------------------------+ 19 20SELECT REGEXP_REPLACE(zabbix.history_str.value, '@.+','') AS 'address' 21FROM 22 zabbix.history_str 23 LEFT JOIN zabbix.items USING(itemid) 24WHERE from_unixtime(zabbix.history_str.clock) BETWEEN '2022-01-02T17:46' AND '2022-03-05T18:46'; 25 26#出力結果 27+--------------------------------------------------------------------------------------------+ 28|address | 29+--------------------------------------------------------------------------------------------+ 30| 123 | 31| 456 | 32| 789|google|| | 33| cat | 34| dog | 35| tiger|yahoo|| | 36+--------------------------------------------------------------------------------------------+ 37 38

理想の結果

sql

1+-----------------------+ 2 3| 123 | 4| 456 | 5| 789 | 6| cat | 7| dog | 8| tiger | 9+-----------------------+

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

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

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

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

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

m.ts10806

2022/03/04 03:02

テーブル定義(CREATE文)と実際に試したSQLを提示してください。
yambejp

2022/03/04 03:54

@が複数あったり、先頭や末尾に@がある場合は想定していますか?
ITOMO5963

2022/03/04 03:59

> @が複数あったり、先頭や末尾に@がある場合は想定していますか? そのような想定はありません。 @がひとつあるか?ないかです。
guest

回答3

0

ベストアンサー

新しめのmariaならREGEXP_REPLACEが実行可能だと思います

SQL

1create table tbl (id int primary key,mail varchar(30)); 2insert into tbl values 3(1,'123@gmail.com'), 4(2,'456'), 5(3,'789@gmail.com'), 6(4,'cat@yahoo.co.jp'), 7(5,'dog'), 8(6,'tiger'); 9 10 SELECT *,REGEXP_REPLACE(mail,'@.+','') as rep from tbl;

投稿2022/03/04 03:59

編集2022/03/04 03:59
yambejp

総合スコア114769

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

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

ITOMO5963

2022/03/04 08:41

参考になりました。 ありがとうございます
guest

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

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

0

以下で対応でできました。

sql

1SELECT DISTINCT SUBSTRING_INDEX(REGEXP_REPLACE(zabbix.history_str.value, '@.+',''), '|', 1) AS 'address' FROM zabbix.history_str LEFT JOIN zabbix.items USING(itemid) WHERE from_unixtime(zabbix.history_str.clock) BETWEEN '2022-03-01T17:46' AND '2022-03-05T18:46'; 2 3

投稿2022/03/04 08:41

編集2022/03/04 08:46
ITOMO5963

総合スコア98

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問