如何解决regexp_substr全部出现doc XXX
以下是示例代码:
set define off;
drop table brol;
create table brol
(
br varchar2(4000)
);
INSERT INTO brol ( br ) VALUES ( 'Proposition de décret institutionnalisant l assemblée citoyenne et le conseil citoyen,déposée par Madame Schyns (Doc. 221 (2019-2020) N° 1 et 1bis)
Proposition de décret spécial modifiant les articles 2,5,6 et 7 du décret spécial du 19 juillet 2018 instituant la consultation populaire,déposée par Madame Schyns (Doc. 222 (2019-2020) N° 1)
Proposition de modification du Règlement du Parlement de Wallonie visant à institutionnaliser les assemblées citoyennes et conseils citoyens,déposée par Madame Schyns (Doc. 223 (2019-2020) N° 1)
Rapporteur : Monsieur Sahli
Proposition de décret spécial modifiant les articles 2,6 et 7 du décret spécial du 19 juillet 2018 instituant la consultation populaire en vue d octroyer un droit d initiative aux commissions délibératives composées de députés et de citoyens tirés au sort,déposée par Madame Schyns,Messieurs Desquesnes,Antoine et Bastin (Doc. 278 (2020-2021) N° 1)
Désignation d un Rapporteur
discussion - Votes
' );
commit;
select * from brol;
select REGEXP_SUBSTR(br,'Doc. ([[:alnum:]]+\.?)') from brol;
我得到的结果是:
Doc. 221
这是第一步,我很高兴找到它... 但是我还需要得到回报:
Doc. 222
Doc. 223
Doc. 278
我不能同时拥有全部三个。 您能帮我找到我在regexp_substr中忘记的内容吗?
select REGEXP_SUBSTR(br,'Doc. ([[:alnum:]]+\.?)',1,1) from brol;
文档。 221
select REGEXP_SUBSTR(br,2) from brol;
文档。 222
select REGEXP_SUBSTR(br,3) from brol;
文档。 223
select REGEXP_SUBSTR(br,4) from brol;
文档。 278
有没有办法知道我会找到多少? ==>不可能。.
我发现了带有函数https://stackoverflow.com/a/23683522/10710461
的方法create or replace function regexp_substr_mr (
p_data Clob, p_re varchar ) 返回varchar为 v_cnt号; v_results varchar(4000); 开始 v_cnt:= regexp_count(p_data,p_re,1,'m'); 如果v_cnt
返回v_results; 结束;
但是我无法适应它...
Thx,
RD
解决方法
您的查询正确,只需使用SELECT DATETIME_FORMAT(CAST('2020-04-05' AS DATE),'dd/MM/YYYY') AS "date";
date
------------------
05/04/2020
即可查找所有内容,
connect by
,
有没有办法知道我会发现多少?
使用REGEXP_COUNT
:
SELECT REGEXP_COUNT( br,'Doc\.\s+\d+' ) AS num_docs
FROM brol;
哪个输出:
| NUM_DOCS | | -------: | | 4 |
您的函数似乎将输出由CR-NL分隔的文档列表。相反,您可以使用:
SELECT RTRIM(
REGEXP_REPLACE( br,'.*?(Doc\.\s+\d+\.?|$)','\1' || CHR(13) || CHR(10),1,'n' ),CHR(13) || CHR(10)
) AS docs
FROM brol
哪个输出:
| DOCS | | :------- | | Doc. 221 | | Doc. 222 | | Doc. 223 | | Doc. 278 | | :------- |
如果您希望这些值位于不同的行中(并且brol
表中可以有多个行),则可以使用:
WITH docs ( br,doc,lvl,num_docs ) AS (
SELECT br,REGEXP_SUBSTR( br,'Doc\.\s+\d+\.?',1 ),REGEXP_COUNT( br,'Doc\.\s+\d+\.?' )
FROM brol
UNION ALL
SELECT br,lvl + 1 ),lvl + 1,num_docs
FROM docs
WHERE lvl < num_docs
)
SELECT doc
FROM docs
WHERE lvl <= num_docs;
哪个输出:
| DOC | | :------- | | Doc. 221 | | :------- | | Doc. 222 | | :------- | | Doc. 223 | | :------- | | Doc. 278 | | :------- |
db 提琴here
,为简单起见,我在表中添加了另一列-ID
(哪种唯一标识每一行)。
SQL> desc brol
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
BR VARCHAR2(4000)
我还通过修改您发布的INSERT
向表中添加了另一行;它包含两个“文档”。值。
最后,这样的查询可能会返回您想要的内容:
SQL> select id,2 regexp_substr(br,'Doc\.\s+\d+.?',column_value) result
3 from brol cross join table(cast(multiset(select level from dual
4 connect by level <= regexp_count(br,'Doc\.')
5 ) as sys.odcinumberlist))
6 order by id,result;
ID RESULT
---------- ----------
1 Doc. 221
1 Doc. 222
1 Doc. 223
1 Doc. 278
2 Doc. 666
2 Doc. 777
6 rows selected.
SQL>
,
功能完美。.我的电话不是...
select regexp_substr_mr(br,'Doc. ([[:alnum:]]+\.?)' ) from brol;
正在工作。 谢谢大家的回答。我将检查究竟是什么“连接”选项,因为我不知道。我在包装中,因此添加功能很容易。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。