0

データベースからデータを返すクエリがあります。!markerstart!1 つのフィールドに、セグメントを含むかなり長いテキスト コメントがあり、や などのマーキング タグで明確に定義されています!markerend!。2 つのマーカーの間の文字列セグメントが削除された (およびマーカーも削除された) クエリを返したいと思います。

私は通常、データを取得した後にクライアント側でこれを行いますが、問題は、クエリがステートメントINSERTからデータを取得するクエリであることです。SELECTテキスト セグメントをアーカイブ/レポート テーブル (ここでは OLTP アプリケーションで作業) に保存したくないので、SELECT挿入する内容を正確に返すステートメントを取得する方法を見つける必要があります。ケースでは、SELECT後処理クライアント側で行うのではなく、不要なフレーズを削除するステートメントを取得することを意味します。

SUBSTRING私の唯一の考えは、 、CHARINDEX、およびの複雑な組み合わせを使用することですが、より良い方法があることを望んでいますが、これCONCATに基づいて、方法がわかりません。誰にもアイデアがありますか?

サンプル:

これは、削除する必要があるセグメントを持つデータベース内のフィールドにある長いテキスト文字列です。!マーカースタート! これは、削除されるセグメントです。長さは不明で可変です。!マーカーエンド! マーカーの後に表示されるこのフィールドの部分はそのままにしておく必要があります。

結果:

これは、削除する必要があるセグメントを持つデータベース内のフィールドにある長いテキスト文字列です。マーカーの後に表示されるこのフィールドの部分はそのままにしておく必要があります。

スタッフを使用したソリューション:

これがどれほど冗長であるかは本当に好きではありませんが、本当に必要な場合は関数に入れることができます。これは理想的ではありませんが、CLR ルーチンよりも簡単で高速です。

SELECT STUFF(CAST(Description AS varchar(MAX)), CHARINDEX('!markerstart!', Description), CHARINDEX('!markerend!', Description) + 11 - CHARINDEX('!markerstart!', Description), '') AS Description
FROM MyTable
4

2 に答える 2

0

Stuff 関数または Replace 関数を使用して、不要な記号を '' に置き換えることができます。STUFF('EXP',START_POS,'NUMBER_OF_CHARS','REPLACE_EXP')

于 2013-09-26T12:43:25.147 に答える