2017-09-28 10 views
3

文字の出現の前に文字列からすべての文字を取得することを試みています。Oracle - 文字のn番目の出現の前にすべての文字を取得

は、私は以下の文字列を持っている可能性が言う:

'123456,123456,123456' 
'123456' 
'123456,123456,123456,123456,123456,123456' 
'123456,123456,123456,123456,123456,123456,123456' 

今、私は私のクエリは常にコンマの第5回出現する前に、すべてを返すようにしたい、

結果:

'123456,123456,123456' 
'123456' 
'123456,123456,123456,123456,123456' 
'123456,123456,123456,123456,123456' 

私はいくつかのsubstrやregexesで試してみましたが、私はこれについて私の頭を得ることはできません。

+0

文字列の長さは常に6 nosですか? –

+0

コンマの間にある 'substring'(123456なので)は常に同じ量の文字なので、この例では6で作業できます。 –

答えて

3

INSTR関数は、n番目の部分文字列の位置を見つけるために必要なものを正確に持っています - オカレンスパラメータを参照してください。

文字列の一部を取得するには、この場所でSUBSTRINGを使用します。 N番目のシンボルがない場合を避けるには、NVL(またはCOALESCE)を使用します。

例えば(Nと5を交換し、あなたの列を挿入):

SELECT NVL(
    SUBSTR(YOUR_COLUMN, 1, 
    INSTR(YOUR_COLUMN,',',1,5) -1), 
    YOUR_COLUMN) 
FROM YOUR_TABLE; 
+0

ありがとう!私はすでにこの答えに非常に近いと思われますが、少しの違いがあります。 –

+1

文字列内の位置は1でインデックス付けされていますが、これがうまくいく間は 'SUBSTR(your_column、1、...'。 – MT0

+0

ありがとう! –

0

は、あなたがそれを行うことができます。

define string_value='123456,123456'; 
select CASE 
      WHEN (length('&string_value') - length(replace('&string_value',',',null))) >=5 
      THEN SUBSTR('&string_value',0,INSTR('&string_value',',',1,5)-1) 
      ELSE '&string_value' 
     END as output 
from dual; 

出力:

123456,123456

define string_value='123456,123456,123456,123456,123456,123456'; 
select CASE 
      WHEN (length('&string_value') - length(replace('&string_value',',',null))) >=5 
      THEN SUBSTR('&string_value',0,INSTR('&string_value',',',1,5)-1) 
      ELSE '&string_value' 
     END as output 
from dual; 

出力:

123456,123456,123456,123456,123456

コンマの間に文字の数は必ずしも同じではない場合、これは、イベントを動作します。

関連する問題