sql - 我可以通过给出 regexp_substr 的查询来创建选择组吗?

标签 sql regex oracle ora-00932

我有一个名为 data_column 的列,它有一些值,例如“123123,12,123123”。我想计算按第二个分组的行数。

但是当我运行

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

它给出了

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

我不能按正则表达式子字符串分组吗?

最佳答案

问题不是来自 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

关于sql - 我可以通过给出 regexp_substr 的查询来创建选择组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4815810/

相关文章:

sql - 错误itgensql005 : unknown identifier 'ID'

mysql - 如何将 SELECT 语句的返回值传递给存储过程中的 DELETE 查询?

oracle - 将过程中的值传递给 Select 语句

oracle - oracle中的时差

sql - 解析自引用表时 CTE 中的无限循环

c# - ASP C# |使用 SQL 和存储过程更新数据库

javascript - 设置正则表达式来测试包含 HTML 标记的输入文本

regex - Primeng KeyFilter 运行不正常

正则表达式查找正确的十进制数 1.0 或 1.99 到 10.0

sql - ORA-01840 : input value not long enough for date format in Oracle Insert using Select