Могу ли я сделать группу выбора по запросу, дающему regexp_substr? - PullRequest
5 голосов
/ 27 января 2011

У меня есть столбец с именем data_column, он имеет некоторое значение, например "123123,12,123123". Я хочу посчитать строки, сгруппированные по второй.

Но когда я бегу

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

Даёт

ORA-00932: недействительные типы данных: ожидается: - получил: CLOB 00932. 00000 - "несовместимые типы данных: ожидается% s получил% s"

Не могу ли я сгруппировать по подстроке регулярного выражения?

1 Ответ

2 голосов
/ 27 января 2011

проблема не в функции 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 для выполнения GROUP BY:

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
...