【问题标题】:How to get REGEXP_LIKE that gets the exact word first, then append all the word related later?如何获得首先获得确切单词的 REGEXP_LIKE,然后附加所有相关的单词?
【发布时间】:2018-08-02 08:48:06
【问题描述】:

表描述:

id   desc
0    ball
1    basketball
2    ballpen
3    a ball
4    ball pen

表所需的输出

id    desc  
 0    ball  
 3    a ball  
 4    ball pen  
 2    ballpen  
 1   basketball

甚至不一样的顺序。 但重要的是先得到确切的词,然后是所有相关的词。一个球仍然被认为是准确的词,所以它可以是第一个。

【问题讨论】:

    标签: regex oracle plsql sql-like


    【解决方案1】:

    我宁愿建议这样的东西,而不是正则表达式:UTL_MATCH

    SQL> with test (id, c_desc) as
      2  (select 0, 'ball'       from dual union
      3   select 1, 'basketball' from dual union
      4   select 2, 'ballpen'    from dual union
      5   select 3, 'a ball'     from dual union
      6   select 4, 'ball pen'   from dual union
      7   select 5, 'littlefoot' from dual
      8  )
      9  select
     10    id,
     11    c_desc,
     12    utl_match.jaro_winkler_similarity (c_desc, '&&par_desc') similarity
     13  from test
     14  where instr(c_desc, '&&par_desc') > 0
     15  order by utl_match.jaro_winkler_similarity (c_desc, '&&par_desc') desc;
    Enter value for par_desc: ball
    
            ID C_DESC     SIMILARITY
    ---------- ---------- ----------
             0 ball              100
             2 ballpen            91
             4 ball pen           89
             3 a ball             80
             1 basketball         65
    
    SQL> undefine par_desc
    SQL> /
    Enter value for par_desc: pinky
    
    no rows selected
    
    SQL> undefine par_desc
    SQL> /
    Enter value for par_desc: tle
    
            ID C_DESC     SIMILARITY
    ---------- ---------- ----------
             5 littlefoot         65
    
    SQL>
    

    【讨论】:

    • 这可用于 sql server oracle 吗? plsql
    • 我不会说 MS SQL Server,但我对此表示怀疑; UTL_MATCH 是 Oracle。
    【解决方案2】:

    这里有两种方法可以首先返回包含独立单词“ball”的所有行,然后是在另一个单词中包含“ball”的行。

    首先,如果您想确保首先出现只有“球”的行,请在您的排序中构建一个案例表达式。

    在此检查值是否等于您的搜索变量。如果它确实映射到一个数字,例如一。如果它没有映射到更高的数字,例如两个。

    要返回所有包含 ball 作为它自己的单词的行,有两种方法:

    regexp_like

    可以使用正则表达式:

    (^|\s|\W)球($|\s|\W)

    SQL 中的样子:

    create table t as 
      select 0 id, 'ball' val from dual union
      select 1, 'basketball' from dual union
      select 2, 'ballpen'    from dual union
      select 3, 'a ball'     from dual union
      select 4, 'ball pen'   from dual union
      select 5, 'littlefoot' from dual;
    
    var v varchar2(10);
    
    exec :v := 'ball';
    
    select * 
    from   t
    where  val like '%' || :v || '%'
    order  by case 
      when val = :v then 1
      when regexp_like ( val, '(^|\s|\W)' || :v || '($|\s|\W)' ) then 2
      else 3
    end, id;
    
    ID   VAL          
       0 ball         
       3 a ball       
       4 ball pen     
       1 basketball   
       2 ballpen 
    

    Oracle 文本

    如果在列上创建 Oracle Text 索引,则可以使用 contains 来查找匹配的行。调用这个两次。一次找到完全匹配。然后再次显示与单词匹配的内容。

    然后按照这些降序的分数进行排序。先是准确的分数,然后是另一个:

    create index test_i on t ( val ) indextype is ctxsys.context;
    
    select t.*, score (1), score (2) from t
    where  contains ( val, :v, 1 ) > 0
    or     contains ( val, '%' || :v || '%', 2 ) > 0
    order  by case 
      when val = :v then 1
      else 2
    end, score ( 1 ) desc, score ( 2 ) desc;
    
    ID   VAL          SCORE(1)   SCORE(2)   
       0 ball                  4          4 
       3 a ball                4          4 
       4 ball pen              4          4 
       1 basketball            0          4 
       2 ballpen               0          4 
    

    【讨论】:

    • (^|\s|\W)ball(basket)($|\s|\W) 这包括 () 吗?因为我认为它不感谢:)
    • @jojo 是否匹配括号?没有。
    • 所以当我搜索 ball(basket) 这是我的数据库中的确切描述时,我该如何搜索它?有时我会在正则表达式中得到这个不匹配的括号,有时根据查询没有结果
    • @jojo ball(basket) 匹配“ballbasket”。如果您不确定正则表达式匹配什么,请在regex101 上尝试一下
    • 谢谢。我只需要转义括号。
    猜你喜欢
    • 2013-04-24
    • 2021-08-21
    • 1970-01-01
    • 2018-06-11
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多