5

data_columnという名前の列があり、「123123,12,123123」のような値があります。2番目の行でグループ化された行を数えたい。

しかし、私が実行すると

select count(*) from table group by regexp_substr(data_column,'[^,]+',1,2);

それは与えます

ORA-00932:incostintentデータ型:expected:-got:CLOB00932。00000-"inconsistent datatypes:expected%s got%s"

正規表現の部分文字列でグループ化できませんか?

4

1 に答える 1

2

問題はregexp_substr関数ではなく、列のデータ型に起因します。

SQL> CREATE TABLE t (data_column CLOB);

Table created
SQL> INSERT INTO t VALUES ('123123,12,123123');

1 row inserted
SQL> INSERT INTO t VALUES ('123124,12,123123');

1 row inserted
SQL> INSERT INTO t VALUES ('123125,11,123123');

1 row inserted

SQL> SELECT regexp_substr(data_column,'[^,]+',1,2) FROM t;

REGEXP_SUBSTR(DATA_COLUMN,'[^,
--------------------------------------------------------------------------------
12
12
11

ここでは、関数が正しく動作していることがわかりますが、Oracle(10.2でテスト済み)では、clob列でグループ化することはできません。

SQL> select count(*) from t group by data_column;

select count(*) from t group by data_column

ORA-00932: inconsistent datatypes: expected - got CLOB

関数の出力をVARCHAR2に変換して、GROUPBYを実行できます。

SQL> SELECT dbms_lob.substr(regexp_substr(data_column,'[^,]+',1,2), 4000),
  2         COUNT(*)
  3   FROM t
  4  GROUP BY dbms_lob.substr(regexp_substr(data_column,'[^,]+',1,2), 4000);

DBMS_LOB.SUBSTR(REGEXP_SUBSTR(    COUNT(*)
------------------------------- ----------
12                                       2
11                                       1
于 2011-01-27T11:45:26.047 に答える