简体   繁体   English

如何从字符串字段 SQL 中提取前 3 个辅音?

[英]How do I extract the first 3 consonates from a string field SQL?

how can I extract from a field in records that contain names only the first 3 consonants and if a name does not have 3 consonants it adds the first vowel of the name?如何从仅包含名称的前 3 个辅音的记录中提取字段,如果名称没有 3 个辅音,它会添加名称的第一个元音?

For example, if I had the following record in the People table:例如,如果我在 People 表中有以下记录:

Field:Name
VALUE:Richard result=> RCH

FIELD:Name
VALUE:Paul  result=> PLA

Here's one option;这是一种选择; read comments within code.阅读代码中的注释。

Sample data:样本数据:

SQL> with test (name) as
  2    (select 'Richard' from dual union all
  3     select 'Paul'    from dual
  4    ),

Query begins here:查询从这里开始:

  5  temp as
  6    -- val1 - consonants; val2 - vowels
  7    (select
  8       name,
  9       translate(upper(name), '#AEIOU', '#') val1,
 10       translate(upper(name), '#BCDFGHJKLMNPQRSTWXYZ', '#') val2
 11     from test
 12    )
 13  -- finally: if there are enough consonants (val1's length is >= 3), return the first 3
 14  -- letters (that's WHEN).
 15  -- Otherwise, add as many vowels as necessary (that's what ELSE does)
 16  select name,
 17    case when length(val1) >= 3 then substr(val1, 1, 3)
 18         else val1 || substr(val2, 1, 3 - length(val1))
 19    end result
 20  from temp;

NAME    RESULT
------- --------------
Richard RCH
Paul    PLA

SQL>

Just for fun using regexp:只是为了好玩使用正则表达式:

select
  name
 ,substr(
    regexp_replace(
       upper(name)
      ,'^([AEIOU]*)([^AEIOU]*)([AEIOU]*)([^AEIOU]*)([AEIOU]*)([^AEIOU]*).*'
      ,'\2\4\6\1\3\5'
    ),1,3) as result
from test;

Full test case:完整的测试用例:

with test (name) as
   (select 'Richard' from dual union all
    select 'Paul'    from dual union all
    select 'Annete'  from dual union all
    select 'Anny'    from dual union all
    select 'Aiua'    from dual union all
    select 'Isaiah'  from dual union all
    select 'Sue'     from dual
   )
select
  name
 ,substr(
    regexp_replace(
       upper(name)
      ,'^([AEIOU]*)([^AEIOU]*)([AEIOU]*)([^AEIOU]*)([AEIOU]*)([^AEIOU]*).*'
      ,'\2\4\6\1\3\5'
    ),1,3) as result
from test;

NAME    RESULT
------- ------------
Richard RCH
Paul    PLA
Annete  NNT
Anny    NNY
Aiua    AIU
Isaiah  SHI
Sue     SUE

7 rows selected.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM