• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MySQL 文字切出し)

MySQL文字切出し方法とは?

このQ&Aのポイント
  • MySQLを使用してNASのアクセスログをrsyslogを介して記録しています。ログ情報は[Message]カラムに格納されており、その中から特定の項目を切り出すためにViewを作成したいと考えています。
  • 例えば、[User:nobody(192.168.???,???)] File Open(Read) /mnt/array1/share/(ファイル名)という形式のログがある場合、UserとIPはsubstring関数とLocate関数を使用して正常に切り出すことができましたが、フォルダ名の切り出しが上手くいきません。
  • 具体的には、Messageカラムの3番目の「/」から4番目の「/」の間の部分を切り出したいです。解決方法をご教示いただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

かなり無理やりですが、以下のSQLでsujino様の求めるshareディレクトリ部分だけを抜き出せるかと思います。 SELECT SUBSTRING_INDEX(hoge,'/',1) as dir FROM (SELECT SUBSTRING_INDEX(text,'/',-2) hoge FROM test) as tmp; ※testというテーブルのtextカラムににMessageカラムの内容が入っていると思ってください。 '/'で区切った文字列の後ろから二個分('share/(ファイル名)')を取り出し、その後'/'で区切った文字列の前から一個分を取ることで'share'を抽出しています。 もっとまともな書き方があると思いますが、ディレクトリの深さが変わらないのであれば、このSQLでも取れるかと思います。 ただ、アプリケーションを通すのであれば、アプリケーション側で文字列処理を書いた方がよいかと思いますので、ご検討ください。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

添付図は、自作のCutStr()を利用して文字列を切り出しています。 ミソは、ある文字列以降を切り出し、更に、ある文字列までとする点。 【イミディエイトウインドウ】 ? CutStr(CutStr("[User:nobody(192.168.???,???)] File Open(Read) /mnt/array1/share/(ファイル名)", ":",2), "(",1) nobody ? CutStr(CutStr("[User:nobody(192.168.???,???)] File Open(Read) /mnt/array1/share/(ファイル名)", "(",2), ")",1) 192.168.???,??? ? CutStr(CutStr("[User:nobody(192.168.???,???)] File Open(Read) /mnt/array1/share/(ファイル名)", "/mnt/array1/",2), "/",1) share なお、CutStr()は、僅かに3行程度の簡単なものです。 Public Function CutStr(ByVal Text As String, _             ByVal Separator As String, _             ByVal N As Integer) As String   Dim strDatas() As String   strDatas = Split("" & Separator & Text, Separator, , 0)   CutStr = strDatas(N * Abs(N <= UBound(strDatas))) End Function

sujino
質問者

お礼

f_a_007様 アドバイス有難うございます。 内容からすると、VBもしくはVBAで処理するのではと思いますが、出来ればMYSQLだけで今後のバックアップ・不要データ削除を考えMySQLだけで完結したいと考えております。 お教え頂いた、Functionは面白そうなので、言語側で処理する際の参考にさせて頂きます。 有難うございました。

すると、全ての回答が全文表示されます。

関連するQ&A