Verificar se rgistro tem letra minuscula

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Existe alguma forma de verificar se em algum registro possui letra minuscula, exemplo:

Selecionar tudo


SELECT US.EMAIL FROM USUARIO US
WHERE US.EMAIL IN ('ANAXYZ@vidalink.com.br') AND
      US.EMAIL LIKE LENGTH(LOWER('%US.EMAIL%'))

Att.
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Você poderia usar o upper:

Selecionar tudo

select us.email from usuario us
where us.email != upper( us.email )
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

se você quer apenas converter para maiuscula use upper conforme foi falado.. se quer o inverso use lower

agora se quer realmente testar se e maiu ou minu.. não sei se tem uma funcao pronta para isso porem na mao isso seri o inicio

Selecionar tudo

SELECT ASCII('A'),
       ASCII('a') 
FROM dual;
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

O mais fácil é usar o lower mesmo, mas se você precisar extrair as minúsculas do texto, pode-se usar expressões regulares.

Selecionar tudo

SQL> with t as (
  2  select 'ABC' col from dual
  3  union all select 'ABCD123' from dual
  4  union all select 'Ab7' from dual
  5  union all select 'x' from dual
  6  union all select 'x888y' from dual
  7  union all select 'zNzNz' from dual)
  8  -- fim dos dados de exemplo
  9  select col,
 10         regexp_replace(col, '[^[:lower:]]') retorna_minusculas,
 11         case when lower(col) = col then 'SIM' else 'NÃO' end tem_minusculas
 12    from t;
 
COL     RETORNA_MINUSCULAS TEM_MINUSCULAS
------- ------------------ --------------
ABC                        NÃO
ABCD123                    NÃO
Ab7     b                  NÃO
x       x                  SIM
x888y   xy                 SIM
zNzNz   zzz                NÃO
 
6 rows selected
 
SQL> 
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Obrigado pela ajuda de todos.

Na verdade estou em busca de inconsistência de dados, por exemplo, gostaria de pegar um registro onde no meio dele exista um caracter em minúsculo quando deveria ser todos em maiuculo, por isso tentei usar o like da seguinte maneira:

Selecionar tudo


 SELECT * FROM USUARIO
 WHERE USUARIO.EMAIL LIKE ('%' || LOWER(USUARIO.EMAIL) || '%')

 
Por curiosidade o Oracle aceita o operador de comparação "<>" e "!=" ?

Att.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Desconsidera meu lapso mental por favor...

Selecionar tudo

SQL> with t as (
  2  select 'ABC' col from dual
  3  union all select 'ABCD123' from dual
  4  union all select 'Ab7' from dual
  5  union all select 'x' from dual
  6  union all select 'x888y' from dual
  7  union all select 'zNzNz' from dual)
  8  -- fim dos dados de exemplo
  9  select col,
 10         regexp_replace(col, '[^[:lower:]]') retorna_minusculas,
 11         case when upper(col) = col then 'NÃO' else 'SIM' end tem_minusculas
 12    from t;
 
COL     RETORNA_MINUSCULAS TEM_MINUSCULAS
------- ------------------ --------------
ABC                        NÃO
ABCD123                    NÃO
Ab7     b                  SIM
x       x                  SIM
x888y   xy                 SIM
zNzNz   zzz                SIM
 
6 rows selected
 
SQL> 
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Como que eu sei se ele "deveria ser todo em maiúsculo" ou não?
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 325
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Tentei fazer das duas formas:

Selecionar tudo

select us.email 
from usuario us 
where us.email != upper( us.email ) --AND
--      US.EMAIL NOT LIKE(UPPER('%' || US.EMAIL || '%'))
                        
SELECT us.email 
FROM USUARIO US
WHERE US.EMAIL LIKE ('%' || LOWER(US.EMAIL) || '%')
Porém ambas me retornam resultados diferentes, sendo que a primeira retorna menos dados que a segunda e ainda me traz registros com valores em maiusculo.

Qual a diferença, é por causa do LIKE?
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Coloque lado a lado e você vai entender:

Selecionar tudo

select us.email, upper(us.email), lower(us.email)
from usuario us
-- etc
Se você quiser buscar palavras que tenham uma letra minúscula seguida imediatamente de uma letra maiúscula, vá por:

Selecionar tudo

select us.email,
       regexp_substr(us.email, '([[:lower:]][[:upper:]])') trecho_inconsistente
  from usuario us
 where regexp_like(us.email, '([[:lower:]][[:upper:]])');
Você precisa de fato de distinção entre maiúsculas e minúsculas? Se não precisar o ideal era dar um UPDATE geral para maiúscula. Ou se você quer reforçar a consistência e impedir o usuário de inserir sujeira, crie uma check constraint com a expressão que funcionar no seu where, após corrigir todos os erros.

Como sugestão, pegue o que estiver inconsistente e dê um update jogando o campo todo para maiúsculas, depois faça a check constraint para garantir que nunca coloquem valores incorretos novamente.

Selecionar tudo

--corrige inconsistências
update usuario
   set email = upper(email)
 where regexp_like(email, '([[:lower:]][[:upper:]])');

-- garante consistência futura
alter table usuario add constraint ck_email check (regexp_substr(email, '([[:lower:]][[:upper:]])') is null);
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante