Oracle SQL - analisar uma cadeia de nome e convertê-lo para o primeiro nome inicial e último

StackOverflow https://stackoverflow.com/questions/371490

  •  21-08-2019
  •  | 
  •  

Pergunta

Alguém sabe como transformar essa string: "Smith, John R"
Dentro dessa cadeia: "jsmith"

?

Eu preciso para minúsculas tudo com inferior ()
Encontre onde a vírgula é e segui-lo de valor inteiro de localização
Obter o primeiro caractere depois que vírgula e colocá-lo na frente da corda
Em seguida, obter todo o último nome e colá-la após a primeira inicial.
Sidenote - função instr () não é compatível com a minha versão
Obrigado por qualquer ajuda!

Foi útil?

Solução

Comece por escrever sua própria função INSTR - chame-my_instr por exemplo. Ele vai começar a CHAR 1 e circuito até encontrar a ''.

Em seguida, use como faria INSTR.

Outras dicas

A melhor maneira de fazer isso é usando o Oracle expressões regulares apresentam, como este:

SELECT LOWER(regexp_replace('Smith, John R', 
             '(.+)(, )([A-Z])(.+)', 
             '\3\1', 1, 1)) 
  FROM DUAL;

Isso diz, 1) quando você encontrar o padrão de qualquer conjunto de caracteres, seguido por "", seguido de um caractere maiúsculo, seguido por quaisquer caracteres restantes, tomar o terceiro elemento (inicial do primeiro nome) e anexar o último nome. Em seguida, fazer tudo em minúsculas.

A sua nota: "função instr () não é compatível com a minha versão" não faz sentido para mim, como que tem sido em torno de idades função. Verifique a sua versão, porque expressões regulares só foi adicionado ao Oracle na versão 9i.

Obrigado por os pontos.

- Stew

instr () não é compatível com a sua versão do que? Oráculo? Você está usando a versão 4 ou algo assim?

Não há necessidade de criar sua própria função, e, francamente, parece um desperdício de tempo em que isto pode ser feito facilmente com funções SQL que já existem. Cuidados devem ser tomados para a conta para entrada de dados desleixado.

Aqui está uma outra maneira de realizar seu objetivo declarado:

with name_list as
  (select '   Parisi, Kenneth R' name from dual)
select name
      -- There may be a space after the comma.  This will strip an arbitrary
      -- amount of whitespace from the first name, so we can easily extract
      -- the first initial.
     , substr(trim(substr(name, instr(name, ',') + 1)), 1, 1) AS first_init
      -- a simple substring function, from the first character until the
      -- last character before the comma.
     , substr(trim(name), 1, instr(trim(name), ',') - 1) AS last_name
      -- put together what we have done above to create the output field      
     , lower(substr(trim(substr(name, instr(name, ',') + 1)), 1, 1)) ||
       lower(substr(trim(name), 1, instr(trim(name), ',') - 1)) AS init_plus_last
  from name_list;  

HTH, Gabe

Eu tenho um tempo difícil acreditar que você não tem acesso a um instr adequada (), mas se esse for o caso, implementar sua própria versão.

Assumindo que você tem que endireitou:

select 
  substr( 
      lower( 'Smith, John R' )
    , instr( 'Smith, John R', ',' ) + 2
    , 1 
  ) || -- first_initial
  substr( 
      lower( 'Smith, John R' )
    , 1
    , instr( 'Smith, John R', ',' ) - 1 
  ) -- last_name
from dual;

Além disso, ter cuidado com a sua suposição de que todos os nomes será nesse formato. Atente para algo diferente de um único espaço após a vírgula, apelidos com dados como “Parisi, Jr.”, etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top