在Oracle SQL中确定连字符后面的字符是否为小写

时间:2014-08-04 16:24:56

标签: sql oracle substring hyphen

我想知道是否有人可以帮我解决这个问题。

我有一个表,其中包含First和Last名称的单独列。我想在名字,姓氏或两者的连字符后查询所有小写字母的名称。

Oracle中有什么东西能让我在没有暴力的情况下做到这一点吗?喜欢使用带参考字符的SUBSTR吗? (' - &#39)

现在我所拥有的只是这个缓慢的混乱:

select FIRST_NAME, LAST_NAME

  from myTABLE

 where FIRST_NAME in (('%-a%'), ('%-b%'), ('%-c%'), ('%-d%'),('%-e%'), ('%-f%'), ('%-g%'), ('%-h%'), ('%-i%'),('%-j%'),('%-k%'), ('%-l%'), ('%-m%'), ('%-n%'),('%-o%'),('%-p%'),('%-q%'),('%-r%'),('%-s%'),('%-t%'), ('%-u%'), ('%-v%'),('%-w%'),('%-x%'),('%-y%'),('%-z%') )

or LAST_NAME in (('%-a%'), ('%-b%'), ('%-c%'), ('%-d%'),('%-e%'), ('%-f%'), ('%-g%'), ('%-h%'), ('%-i%'),('%-j%'),('%-k%'), ('%-l%'), ('%-m%'), ('%-n%'),('%-o%'),('%-p%'),('%-q%'),('%-r%'),('%-s%'),('%-t%'), ('%-u%'), ('%-v%'),('%-w%'),('%-x%'),('%-y%'),('%-z%') ) 

1 个答案:

答案 0 :(得分:3)

试试这个:

with t(firstname, lastname) as (
  select 'firstname1with-lowercase', 'lastname1with-lowercase' from dual union all
  select 'firstname2with-Uppercase', 'lastname1with-lowercase'from dual union all
  select 'firstname3with-lowercase', 'lastname1with-Uppercase'from dual union all
  select 'firstname4with-Uppercase', 'lastname1with-Uppercase'from dual
)
select t.*
     , case
         when REGEXP_LIKE(firstname, '\-[a-z]') and REGEXP_LIKE(lastname, '\-[a-z]') then 'by firstname and lastname' 
         when REGEXP_LIKE(firstname, '\-[a-z]') then 'by firstname' 
         else 'by lastname' 
       end condition
  from t
 where REGEXP_LIKE(firstname, '\-[a-z]')
    or REGEXP_LIKE(lastname, '\-[a-z]')

FIRSTNAME                   LASTNAME                    CONDITION
---------------------------------------------------------------------------------
firstname1with-lowercase    lastname1with-lowercase     by firstname and lastname
firstname2with-Uppercase    lastname1with-lowercase     by lastname
firstname3with-lowercase    lastname1with-Uppercase     by firstname

所以[a-z]表示我需要az之间一个字符,如果您使用某些特殊符号(如å或ä或ö)或其他必须使用[a-zåäö] 。如果你想添加大写字母,你可以使用[a-zåäöA-ZÄÖÅ](你可以自己添加数字或特殊符号)。 \-意味着我正在寻找一个连字符。我不能只使用连字符,我必须使用反斜杠符号来逃避它。

因此,显示的正则表达式是一个掩码,用于在连字符后面用连字符和小写字符搜索单词。

您可以在oracle中详细了解regular expressions及其support