我想知道是否有人可以帮我解决这个问题。
我有一个表,其中包含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%') )
答案 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