我可以通过查询给出regexp_substr来创建一个选择组吗?

ogu*_*alb 5 regex sql oracle ora-00932

我有一个名为data_column的列,它有一些像"123123,12,123123"的值.我想计算按第二个分组的行.

但是当我跑的时候

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

它给

ORA-00932:incostintent数据类型:预期: - 得到:CLOB 00932. 00000 - "不一致的数据类型:预期%s得到%s"

不能用正则表达式子串组合吗?

Vin*_*rat 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
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到该函数的行为正确,但是 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
Run Code Online (Sandbox Code Playgroud)

您可以将函数输出转换为 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
Run Code Online (Sandbox Code Playgroud)