2

という名前の文字列列を持つlexという名前のテーブルがありますCHARGE_CODE_DESCR

行は、次の構造を持つ文字列で構成されます。

USPOB000 - SMS usluga- Pobjeda
U211 - Video i Data pozivi
...
...

-最初の単語 ( の前) を VALUE という名前の列に入れ、残りのすべての単語 ( の後-) を TEXT という名前の 2 番目の列に入れたいと思います。

たとえば、最初の 2 行から、次の結果を取得したいと考えています。

VALUE     TEXT
USPOB000  SMS usluga- Pobjeda
U211      Video i Data pozivi

最初の単語を取得するために、次のクエリを作成しました。

SELECT DISTINCT regexp_substr(CHARGE_CODE_DESCR,'\w+') as VALUE from lex

残りのテキストを取得するために、次のクエリを作成しました。

SELECT DISTINCT SUBSTR(Text, 3, LENGTH(Text)) as TEXT
FROM
(
   select SUBSTR(CHARGE_CODE_DESCR, INSTR(CHARGE_CODE_DESCR, '- ')) as Text from lex
)

両方を 1 つのクエリに結合して、データのすべての行から目的の 2 つの列を作成するにはどうすればよいですか?

4

2 に答える 2

2

以下の解決策を試してください:

WITH
  data AS
  (SELECT 'USPOB000 - SMS usluga- Pobjeda' AS str FROM dual
  UNION SELECT 'U211 - Video i Data pozivi' AS str FROM dual)
SELECT
    regexp_substr(str, '(.*?) -', 1, 1, NULL, 1) AS Value,
    regexp_substr(str, '- (.*)', 1, 1, NULL, 1) AS Text
  FROM data
;

アイデアは、一致したグループへの参照を使用することです (の最後のパラメーターregexp_substr) - 1 は、「最初のグループにあるものは何でも与えてください。各グループは、セットまたは括弧で囲まれて識別されます」。また、貪欲でない * 演算子も使用しました (その後に疑問符が続く?ため、 * 演算子はハイフンを飲み込みません-

regexp_substr に関する Oracle ドキュメントの詳細を参照してください。

編集:テーブルと列名を使用して:

SELECT DISTINCT
    regexp_substr(charge_code_descr, '(.*?) -', 1, 1, NULL, 1) AS Value,
    regexp_substr(charge_code_descr, '- (.*)', 1, 1, NULL, 1) AS Text
  FROM lex
;
于 2013-10-17T13:41:12.707 に答える
2

両方を 1 つのクエリで組み合わせるにはどうすればよいですか

これと同じくらい簡単です。正規表現関数を含める必要はまったくありません。

/* sample of data */
with t1( col) as(
  select 'USPOB000 - SMS usluga- Pobjeda' from dual union all
  select 'U211 - Video i Data pozivi'     from dual
)
/* actual query */
select substr(col, 1, instr(col, '-')-1) as val
     , substr(col, instr(col, '-') + 1)  as text
 from t1

結果:

VAL                            TEXT
------------------------------ ------------------------------
USPOB000                        SMS usluga- Pobjeda
U211                            Video i Data pozivi
于 2013-10-17T13:43:23.013 に答える