lastInfdexOf 関数の MySQL 実装例

lastInfdexOf 関数の MySQL 実装例

MySQL では lastIndexOf に似た関数を使用する必要がある場合もありますが、すぐに使用できる既製の関数は用意されていないため、自分で見つけ出す必要があります。

まず、MySQL は次の 3 つの機能を提供します。

instr(str:varchar, substr:varchar): str# 内の subsrtr の最初の出現を返します。例: 文字列 ab/cd/abc.html 内の b の最初の出現を検索します。select instr('ab/cd/abc.html', 'b');
# プログラマーが考えているのとは異なり、上記の結果は 2 です (添え字は 1 から始まりますので注意してください)

逆(str:varchar): 文字列を先頭から末尾まで反転し、abcを入力してcbaを出力します。

length(str:varcha): 文字列の長さを返します

上記の情報を知った後、ほとんどの人は lastInfdexOf 関数の実装方法を知っていると思います。

直接与える:

select length('入力文字列') - instr(reverse('入力文字列'), '検索する文字列');
# 例: 文字列 'ab/cd/abc.html' 内の '/' の最後の位置を検索します。結果は次のとおりです: 5
length('ab/cd/abc.html') - instr(reverse('ab/cd/abc.html'), '/') を選択します。

最後に、最近私が遭遇した小さな要件を以下に示します。

データベース フィールドの値 (値は ab/cd/abc.html などのファイルのパス名) を取得し、ファイル名 (abc.html) を解析する SQL スクリプトを記述します。

右から選択(CONTENT_NAME, instr(reverse(CONTENT_NAME), '/') - 1) FILE_NAME
config_template_contentから
where lower(CONTENT_NAME) like '%/%.html';
# データに / が含まれている場合はこれで十分です。フィールド値が abcde.html の場合は判断が必要です〜

上記は正しい機能の使い方です。その有用性はご自身で探して(体験して)みてください。

補足: mysql の SELECT LAST_INSERT_ID() ステートメントの使用時に発生する問題

序文:

主キーが自動増分であるデータベース テーブル (ユーザー テーブルなど) にレコードを挿入する場合、書き込まれたばかりのレコードの ID を取得することが期待されます (シナリオによっては、他の操作を実行するためにこの ID を取得する必要があるため)。この時点で、SELECT LAST_INSERT_ID() ステートメントを使用して、レコードが挿入された後に返される自動増分 ID の値を取得する必要があります。

例:

 /**
 * 苦情情報を挿入 * @param complaintInfoModel
 * @戻る
 */
 @InsertProvider(タイプ = ComplaintInfoDao.ComplaintProviderSql.class、メソッド = "insertComplaintInfo")
 @SelectKey(ステートメント="SELECT LAST_INSERT_ID()", keyProperty="id", before=false, resultType=Integer.class)
 Integer insertComplaintInfo(ComplaintInfoModel complaintInfoModel); // データを挿入し、変更されたデータベースエントリの数を返します

Mybatis の SelectKey は、データ挿入時に主キーが自動的に生成されない問題を解決するためのものです。主キーの生成方法を任意に設定できます。しかし、SelectKey がどれだけ優れていても、このような状況に遭遇しないようにしてください。結局のところ、非常に面倒です。

selectKey 属性

財産説明する
キープロパティselectKey ステートメントの結果を設定するターゲット プロパティ。
結果タイプ

結果のタイプ。

MyBatis は通常それを理解できますが、書くことも問題ありません。 MyBatis では、文字列を含む任意の単純な型を主キー型として使用できます。

注文

これは BEFORE または AFTER に設定できます。

BEFORE に設定すると、最初に主キーを選択し、keyProperty を設定してから、挿入ステートメントを実行します。

AFTER に設定すると、挿入ステートメントが最初に実行され、その後に selectKey 要素が実行されます。これは、シーケンス呼び出しを挿入ステートメントに埋め込むことができる Oracle などのデータベースに似ています。

ステートメントタイプ

これまでと同様に、MyBatis は STATEMENT、PREPARED、CALLABLE ステートメントのマッピング タイプをサポートしています。

それぞれ PreparedStatement および CallableStatement タイプを表します。

----1. SelectKeyは順序属性に注意する必要があります。

MySQL などの自動拡張をサポートするデータベースでは、正しい値を取得するために order を after に設定する必要があります。

Oracle のようなシーケンスを取得する場合は、before に設定する必要があります。そうしないと、エラーが報告されます。

-----2. さらに、Springを使用してトランザクションを管理する場合、

SelectKey と insert は同じトランザクション内にあるため、この場合、データがデータベースに挿入されないため、Mysql は自動的に増加されたキーを取得できません。

トランザクション管理をキャンセルすれば問題は発生しません。

以下は XML と注釈の例です。SelectKey は非常に単純なので、次の 2 つの例で十分です。

<挿入id="挿入" パラメータタイプ="マップ"> 
 テーブル1 (名前) の値 (#{名前}) に挿入します 
 <selectKey 結果タイプ="java.lang.Integer" キープロパティ="id"> 
  コールID() 
 </selectKey> 
 </挿入>

上記の xml の入力パラメータは map であり、selectKey は結果を入力パラメータ map に格納します。 POJO でも状況は同じですが、注意すべき点が 1 つあります。keyProperty に対応するフィールドには、POJO 内に対応する setter メソッドが必要であり、setter のパラメーター型が一貫している必要があります。そうでない場合は、エラーが報告されます。

@Insert("table2 (name) の値(#{name}) に挿入") 
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class) 
int insertTable2(名前 name);

上記は注釈の形式です。

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • Mysql マスタースレーブ同期 Last_IO_Errno:1236 エラー解決
  • MySQLとElasticsearch間のデータ非対称性問題の解決策
  • MySQL レプリケーション エラー Last_SQL_Errno:1146 の解決方法
  • Mysql の LAST_INSERT_ID() 関数の使用に関する詳細な説明

<<:  ウェブページ作成時のHTMLタグの使用に注意してください

>>:  Dockerネットワーク作成に--subnetを追加した後の問題を解決する

推薦する

システム エラー 1067 のため、MySQL 5.6 解凍バージョン サービスを開始できません

今日午後ずっと私を悩ませたバグを記録する半月前から始めましょう。それから.................

Linux での tcpdump コマンドの詳細な分析と使用方法

導入簡単に言えば、tcpdump は、ネットワーク上のトラフィックをダンプし、ユーザーの定義に従って...

Hyper-v仮想マシンを使用してCentos7をインストールする

目次導入準備するシステムイメージをダウンロードHyper-Vを有効にする新しい仮想ネットワークスイッ...

Jenkins の紹介と Docker で Jenkins をデプロイする方法

1. 関連概念1.1 Jenkins の概念: Jenkins は、使用されるプラットフォームに関係...

MySQL は重複データを削除して最小の ID ソリューションを維持します

オンラインで検索して重複データを削除し、ID が最小のデータだけを残します。方法は次のとおりです。 ...

Vueプロジェクトのパッケージングと展開の実際のプロセスの記録

目次序文1. 準備 - サーバーとnginxの使用1. サーバーを準備する2. nginxをインスト...

Docker で onlyoffice をインストールして展開する詳細なプロセス

0. システム要件CPU I5-10400F以上メモリ 16 GB、32 GBのメモリが最適ハードド...

ルート権限なしでログインするためのDockerソリューション

docker コマンドを初めて使用する場合、権限の問題を確認するメッセージが表示されます。 unix...

MySql COALESCE 関数の使用コード例

COALESCE は、各パラメータ式 (expression_1、expression_2、...、...

Docker チュートリアル: コンテナの使用 (簡単な例)

Docker を初めて使用する場合は、コンテナの管理を始めるために習得する必要がある基本的なコマン...

React と Threejs を使用して VR パノラマ プロジェクトを作成する詳細なプロセス

最近、 Three.jsでReactを使用して、720 度のパノラマ写真を閲覧できるプロジェクトを構...

vue3.0 でカルーセル コンポーネントをカプセル化する手順

目次1: カプセル化の考え方2. 包装工程3: ドットインジケーター4: 左と右のインジケーター5:...

Maven+Tomcat 基本イメージを構築する Docker の実装

序文Javaプログラミングでは、ほとんどのアプリケーションはMavenに基づいて構築されており、配信...

ネイティブjsは9マスグリッドのドラッグアンドドロップを実現します

ネイティブJSを使用して9つの正方形のグリッドを記述し、9つのグリッドの位置をドラッグして変更する効...

jQueryアニメーションを理解するのに役立つ記事

目次1. 要素の表示と非表示を制御する show() hide() 2. 要素の透明度を制御する f...