Oracle SQL -仅从列中提取一些单词?

k3fezbri  于 2023-06-22  发布在  Oracle
关注(0)|答案(3)|浏览(185)

我正在使用Oracle SQL,我有一个列,其中包含我想要提取的特定单词。例如,我有:

MENACE DE MORT REITEREE EN RECIDIVE
VIOLENCES SUR CONJOINT

我想摘录:

MENACE MORT
VIOLENCES CONJOINT

我尝试使用regex_replace来替换单词列表中的特定单词,但我无法只提取特定单词。有办法做到这一点吗?我有大约50个特定的单词要提取。
提前感谢您的帮助!

pvcm50d1

pvcm50d11#

在任何情况下,你都需要一个单词列表(可能还有一些单词的顺序)来完成这项工作。其中一个选项是创建单词列表并将其存储在表中。在这个答案中,我将创建CTE(单词)作为示例。但首先要使用一些示例数据:

WITH            --  S a m p l e   D a t a :
    tbl (ID, TXT) AS
        (   
            Select 1, 'MENACE DE MORT REITEREE EN RECIDIVE' From Dual Union All
            Select 2, 'VIOLENCES SUR CONJOINT' From Dual Union All
            Select 3, 'MALTRAITANCE PSYCHOLOGIQUE SUR CONJOINT' From Dual
        ),

。和单词列表。。

words_str AS
        (     
            Select '\MENACE\VIOLENCES\MALTRAITANCE\PSYCHOLOGIQUE\MORT\CONJOINT\' "WORDS_TO_RETURN" From Dual
        ), 
    words AS
        (
            Select  LEVEL "WORD_ID", SubStr(WORDS_TO_RETURN, InStr(WORDS_TO_RETURN, '\', 1, LEVEL) + 1, InStr(WORDS_TO_RETURN, '\', 1, LEVEL + 1) - InStr(WORDS_TO_RETURN, '\', 1, LEVEL) -1) "WORDS"
            From    words_str
            Connect By LEVEL <= Length(WORDS_TO_RETURN) - Length(Replace(WORDS_TO_RETURN, '\', '')) - 1
        )

| WORD_ID|文字|
| - -----|- -----|
| 1|威胁|
| 2|暴力|
| 3|通奸|
| 4|心理学|
| 5个|MORT|
| 六|联合|
现在,您可以将表格与单词连接起来,并将文本截断到上面的单词列表中...

--  M a i n   S Q L :
SELECT  DISTINCT ID, TXT, 
        LISTAGG(WORDS, ' ') OVER(Partition By ID, TXT) "SHORT_TXT"
FROM   (   Select  t.ID, t.TXT,  w.WORD_ID, w.WORDS
           From tbl t
           Inner Join  words w ON(  InStr('\' || Replace(t.TXT, ' ', '\') || '\' , '\' || w.WORDS || '\') > 0 )
           Order By t.ID, w.WORD_ID
        )
ORDER BY ID

结果应该是。。
| ID| TXT|简体中文|
| - -----|- -----|- -----|
| 1| MENACE DE MORT REITERIE EN RECIDIVE|死亡威胁|
| 2|联合暴力|联合暴力|
| 3|共同出轨心理学|出轨心理学联合体|

3b6akqbq

3b6akqbq2#

你也可以

CREATE INDEX index_name ON target_table(target_column) INDEXTYPE IS CTXSYS.CONTEXT;

然后,而不是玩CTE,递归查询,和其他好东西…只需将搜索表达式(使用布尔运算符)存储在“查询”表中:例如“威胁与死亡”,...(见这里的doc:https://docs.oracle.com/en/database/oracle/oracle-database/21/ccref/oracle-text-CONTAINS-query-operators.html#GUID-6410B783-FC9A-4C99-B3AF-9E0349AA43D1)然后

SELECT ... FROM target_table t, queries q
WHERE CONTAINS(t.target_column, q.query_column) > 0;
drkbr07n

drkbr07n3#

您可以使用简单的正则表达式和connectby将字符串拆分为行,并从中选择所需的行。也许将你想要的值存储在一个表中,然后连接到它。

with temp as  (
       select 1 as someID, 'MENACE DE MORT REITEREE EN RECIDIVE' as someStr  from dual
     )

select 

  someid,
  listagg(str, ' ') within group ( order by str) 
  from (
SELECT distinct someID ,trim(regexp_substr(someStr, '[^ ]+', 1, level)) str
  FROM (SELECT someID, someStr FROM temp) t
CONNECT BY instr(someStr, ' ', 1, level - 1) > 0
) t
  where
str in (
'MENACE' , 'MORT'
  )
group by
  someid

Fiddle

相关问题