2017-09-03 4 views
0

次のSQL結果エントリがあります。テキスト列からネストされた文字列を抽出します。

Result 
--------- 
TW - 5657980 Due Date updated : to <strong>2017-08-13 10:21:00</strong> by <strong>System</strong> 
TW - 5657980 Priority updated from <strong> Medium</strong> to <strong>Low</strong> by <strong>System</strong> 
TW - 5657980 Material added: <strong>1000 : Cash in Bank - Operating (Old)/ QTY:2</strong> by <strong>System</strong>#9243 
TW - 5657980 Labor added <strong>Kelsey Franks/14:00 hours </strong> by <strong>System</strong>#65197 

この結果から短い説明を抽出し、同じテーブルの別の列に移行しようとしています。

Expected result 
-------------- 
Due Date Updated 
Priority Updated 
Material Added 
Labor Added 

最初の13文字を無視します。ほとんどの場合、「更新済み」で終わります。いくつかの '追加'で終わります。大文字小文字を区別しないでください。
期待どおりの結果を得る方法はありますか?

+0

タスクを定義するのに十分な情報がありません。 –

+0

@Erwin:SQLで文字列を抽出し、前述のように結果を期待したい。 –

+0

重要な情報がありません:「短い説明」は常に「更新済み」または「追加済み」で終わりますか?大文字と小文字を区別? (そして、これらの言葉は何度も現れていませんか?)私たちが無視している主要部分は常に正確に13文字ですか?または、文字列の開始と終了を正確に定義する方法は他にありますか? –

答えて

1

解決策substring()正規表現を使用します。 は最初の13文字のをスキップし、最初のに更新されたまたは'が追加された'の文字列を先頭に空白で置き換えます。他NULL

SELECT substring(result, '(?i)^.{13}(.*? (?:updated|added))') 
FROM tbl; 

正規表現について説明:

(?i)を.. meta-syntax
^を一致大文字と小文字を区別しないに切り替える..ストリング
.{13}の開始を..最初の13文字
()をスキップ..キャプチャカッコ(キャプチャペイロード)
.*? ..任意の数の文字(non-greedy
(?:) ...非キャプチャー括弧
(?:updated|added) ... 2本の枝(文字列は「更新」または「追加」で終わる)


我々は13人の主人公like you later commentedに頼ることができない場合は、我々はいくつかを必要とします代わりに他の信頼できる定義。あなたの難しさは実際の実装よりも曖昧な要求であるようです。桁
ため

SELECT substring(result, '(?i)^\D+\d+ (.*? (?:updated|added))') ... 

\d ..クラス速記:上記で定義した

言って、我々は、1桁以上、スペース、次にペイロードに続く、1以上の非数字を扱っています\D ..非数字、逆の\d

+0

情報ありがとうございます。 13文字の長さを見つけることは可能ですか?私はその12または11文字が間違った結果を与える場合、それを発見した。 –

+0

動的な文字の長さを取得すると良いでしょう。時には10,11,12、または13です。 –

+0

@PranavUnde:可能な限り、あなたは*の質問に完全な情報*を書かなければなりません。位置14でない場合の文字列の開始点は何ですか?数字の最初のシーケンスの後の最初の非数字と空白?私は教育的な推測に基づいて別のソリューションを追加しました。 –

関連する問題