5

SQL クエリ (oracle 11) のテキスト ボックスからテキストの最初の行を返そうとしています。テキスト ボックスの内容は次のようになります。

   X WITHDRAWN

   Explanation.

一番上の行、つまり X WITHDRAWN を返したいです。最初の行だけを見るように指定できるのか、それともキャリッジ リターンの前にすべてのテキストを返すように指定できるのかはわかりません。

regexp_substr を使用する必要があると思いますが、構文についてはよくわかりません。私が試してみました:

   regexp_substr(TABLE.TEXT,'^.*$')

しかし、それはうまくいきませんでした。

編集:使用されるソリューション:

   select regexp_substr(TABLE.TEXT, '[^,]+['||CHR(10)||']') from tab

編集:回答で改行と改行が混在していることに気付いたので、次の解決策を使用してテキストのみを返し、追加の文字は返しません。

    select 
     replace(replace(regexp_substr(TABLE.TEXT, '[^,]+['||CHR(10)||']'),CHR(10),''),CHR(13),'') 
     from tab 

編集: @Ben の回答に続いて、ソリューションを次のように修正しました。

select
initcap(replace(regexp_substr(TABLE.TEXT, '.*$', 1, 1, 'm'),CHR(13),''))
from tab
4

2 に答える 2

9

Parado の正規表現は、コンマ以外のすべてのものに複数回一致し、その後にキャリッジ リターンが続きます。これは、改行やテキストにコンマがある場合には機能しないことを意味します。

Oracle は、m match パラメータを使用した複数行の式をサポートしています。このモードを使用する$と、文字列の末尾だけでなく、各行の末尾も一致します。これを使用して、式を大幅に単純化して、次のことを行うことができます。

regexp_substr(str, '.*$', 1, 1, 'm')

つまり、最初の文字から数えて、何かに一致する文字列の最初の出現 (最初の行) に一致し、その後に文字列の末尾が続きます。

例として:

with strings as ( 
 select 'hi
         hi again' as str
   from dual
  union all
 select 'bye
         and again'
   from dual
        )
 select regexp_substr(str, '.*$', 1, 1, 'm')
   from strings
于 2013-07-15T12:53:40.460 に答える
2

正規表現の代わりに、直接部分文字列 (キャリッジ リターン - Chr(10) - 検索記号) を使用してみてください。

  SubStr(Table.Text, 1, decode(InStr(Table.Text, Chr(10)), 0, Length(Table.Text), InStr(Table.Text, Chr(10))) - 1)
于 2013-07-15T11:19:37.427 に答える