2011-01-27 1 views
5

J'ai une colonne nommée data_column, elle a une certaine valeur comme "123123,12,123123". Je veux compter les lignes groupées par la seconde.Puis-je créer un groupe select par requête en donnant un regexp_substr?

Mais quand je lance

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

Il donne

ORA-00932: incostintent types de données: prévu: - obtenu: CLOB 00932. 00000 - "incohérents types de données: attendu% s obtenu% s"

Cant i groupe par une sous-chaîne regex?

Répondre

2

le problème ne vient pas de la fonction regexp_substr mais de votre colonne type de données:

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 

Ici, vous voyez que la fonction se comporte correctement, mais Oracle (testé avec 10.2) ne vous permet pas de groupe avec une colonne 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 

Vous pouvez convertir la sortie de fonction à un VARCHAR2 pour exécuter le gROUPE pAR:

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