1

実行しようとしている SQL ステートメントについて助けが必要です。かなりの量の読み取りとテストを行いましたが、正しい結果が得られないため、ここでリクエストします。

2 つのソースからデータが連結された列からデータを抽出しようとしています。結合の前後でデータを分離したいのですが、結合は「-」(両側にスペースのあるハイフン) で、英数字を使用できます。その「 - 」の前後の文字。これが必要なデータです。複雑さを増すために、一部の行にはデータが結合されていません。つまり、「 - 」がありません。これが満たされている場合は、列の値全体を抽出して BB 側として扱うだけで問題ありません (以下の最初の BB の例を参照)。 .

したがって、終了したら、AA 側 (- の前) と BB 側 (- の後) を分離して、単一の BB の状況を考慮したいと思います。

データを見ると、次のシナリオが発生する可能性があります。

BB<br>
AA - BB<br>
AA-aa - BB<br>
AA - BB-bb-cc<br>
AA-aa - BB-bb-cc<br>

コードを動作させることはできますが、上記のすべてのシナリオで一貫しているとは限りません。適切なコードを提案できますか、または SQL のパフォーマンスに影響を与えないより良い解決策があるかどうかを教えてください。

私がAA側で試してきた例:-

動作:

select substr('AA - BB-bb', 0, instr('AA - BB-bb', ' - ', 1, 1)-1) AS A_NAME 
from DUAL;

失敗 (AA のみを取得し、AA-aa を取得しない):

select substr('AA-aa - BB-bb', 0,instr('AA-aa - BB-bb', ' - ', 1, 1)-1) AS A_NAME
from DUAL;

私がBB側で試してきた例:-

失敗:

select SUBSTR('AA-aa - WHENEHEH', INSTR('AA-aa - WHENEHEH',' - ', -1, 1)+1, 100)
 B_NAME from dual;

ありがとう、マーク。

4

4 に答える 4

0

ここに私があなたのために働くと思うものがあります. (あなたの要件を正しく理解できたと思います)あなたが言及したすべての例でクエリを試してみましたが、うまくいきました。

SELECT REGEXP_SUBSTR ('AA-aa - BB-bb-cc',
                  '[^ - ]+')
      "Right Side",
   SUBSTR ('AA-aa - BB-bb-cc',
             INSTR ('AA-aa - BB-bb-cc',
                    ' - ')
           + 2)
      "Left Side"
  FROM DUAL;

これは、BB 以外のすべてで機能します。その回避策として、区切り文字が存在するかどうかを確認できます。存在しない場合は、右側の値全体を取得できます。

SELECT    SUBSTR ('AA aa - BB',0,
           INSTR ('AA aa - BB',
                ' - ')
          )
    "Right Side",
SUBSTR('AA aa - BB',INSTR('AA aa - BB',
                  ' - ')+2)
      "Left Side"
 FROM DUAL;      
于 2013-01-24T21:46:56.717 に答える
0

最初の列ではなく2番目の列に単一の値が表示されるという条件は少し奇妙ですが、これにより、必要な他のすべてが実行されるはずです。

with testdata as (
select 'BB'  as input_col, 1 as row_num from dual
union
select 'AA - BB', 2 from dual
union
select 'AA-aa - BB',3 from dual
)
select testdata.row_num,
case when (regexp_instr(testdata.input_col,'(\ -\ )') > 0) then
  regexp_replace(testdata.input_col, '(.*)(\ -\ )(.*)$', '\1')
else null
end output_col1,
regexp_replace(testdata.input_col, '(.*)(\ -\ )(.*)$', '\3') as output_col2
from testdata
order by testdata.row_num;

編集:ケースチェックを追加するために上記を変更しました。おそらく regexp_replace 自体を介してこれを行うもっと雄弁な方法があることは認めますが、これも機能します。

于 2013-01-24T19:11:31.933 に答える
0

シナリオのリストに示されているように、パターン「- BB」に依存できると仮定すると、それを使用して分割を見つけることができます。

WITH
DATA AS (
  SELECT 'BB' text FROM dual
  UNION ALL SELECT 'AA - BB' FROM dual
  UNION ALL SELECT 'AA-aa - BB' FROM dual
  UNION ALL SELECT 'AA - BB-bb-cc' FROM dual
  UNION ALL SELECT 'AA-aa - BB-bb-cc' FROM dual
  ),
break AS (
  SELECT text, instr(text, '- BB') breakpos  FROM DATA
)
SELECT
  text,
  CASE WHEN breakpos = 0 THEN NULL ELSE substr( text, 1, breakpos-1 ) END aa_side,
  case when breakpos = 0 then text else substr( text, breakpos+2) end bb_side
FROM break
;
于 2013-01-24T19:07:08.363 に答える