-1

選択クエリがあり、複雑なデータを含むフィールドをフェッチします。そのデータを指定された形式で解析する必要があります。あなたの専門知識を助けてください:

selected string = complexType|ChannelCode=PB - Phone In A Box|IncludeExcludeIndicator=I

expected output - PB|I

この出力を達成するためにSQL正規表現を書くのを手伝ってください。

4

1 に答える 1

0

正規表現を理解するための最初のステップは、それを平易な言葉で記述できるようにすることです。あなたの投稿から私たちが知っていること(そして他の人が言ったように、より多くの情報が本当に必要です)に基づいて、いくつかの仮定を立てる必要があります.

あなたが提供したサンプルデータに基づいて、次のように説明することでそれを突き刺します:等号に続く1つ以上の文字のセットが必要ですが、次のスペースまたは行末は含まれません. 出力は、パイプで区切られたこれらの文字セットであり、左から右に読み取ったときに文字列内で検出された順序である必要があります。私の仮定はテスト データに基づいています。文字列には 2 つの等号しか存在せず、最後のデータ要素の後にはスペースがなく、行末が続きます。その情報を使用して正規表現を作成できますが、正規表現を変更する他の事実も考慮する必要があります。

  • 等号が 2 つ以上ある可能性はありますか?
  • 等号の後に空のデータ要素がある可能性はありますか?
  • 等号の後のデータ セットに 1 つ以上のスペースが含まれていませんか?

これらはすべて、正規表現をどのように設計する必要があるかに影響します。とはいえ、提供されたデータと前述の仮定に基づいて、次に、文字列を記述する正規表現を作成し (実際にはプレーン言語から正規表現言語に変換します)、保持したいデータ セットをグループ化します。文字列を、パイプで区切られたデータ セットに置き換えます。

SQL> with tbl(str) as (
  2    select 'complexType|ChannelCode=PB - Phone In A Box|IncludeExcludeIndicator=I' from dual
  3  )
  4  select regexp_replace(str, '^.*=([^ ]+).*=([^ ]+)$', '\1|\2') result from tbl;

RESU
----
PB|I

一致正規表現は次のように説明されています。

^        Match the beginning of the line
.        followed by any character
*        followed by 0 or more 'any characters' (refers to the previous character class)
=        followed by an equal sign
(        start remembered group 1 
[^ ]+    which is a set of one or more characters that are not a space
)        end remembered group one
.*=      followed by any number of any characters but ending in an equal sign
([^ ]+)  followed by the second remembered group of non-space characters
$        followed by the end of the line

置換文字列の説明:

\1       The first remembered group
|        a pipe character
\2       the second remember group

この回答は、示されている正確なサンプルデータに対するものであり、すべての場合に機能するとは限らないことに注意してください。扱うデータを分析する必要があります。いずれにせよ、これらの手順は、困難な正規表現に直面したときに問題を分析するための出発点となるはずです。重要なことは、存在する可能性のあるすべてのタイプのデータとパターン (または NULL) を考慮し、正規表現のすべてのケースを考慮して、正確なデータを返すことです。

編集:これを確認してください。等号の直後のすべての値を解析し、null を許可します。

SQL> with tbl(str) as (
  2    select 'a=zz|complexType|ChannelCode=PB - Phone In A Box|IncludeExcludeIndicator=I - testing|test1=|test2=test2 - testing' from dual
  3  )
  4  select regexp_substr(str, '=([^ |]*)( |||$)', 1, level, null, 1) output, level
  5  from tbl
  6  connect by level <= regexp_count(str, '=')
  7  ORDER BY level;

OUTPUT                    LEVEL
-------------------- ----------
zz                            1
PB                            2
I                             3
                              4
test2                         5

SQL>
于 2015-07-24T13:53:29.860 に答える