Inquiridor
Ajuda para Atualizar campo

Pergunta
-
Olá amigos,
Estou precisando de uma grande ajuda. Estou precisando uma query para atualizar um campo caso.
Tenho uma base com todos os dados da pessoa certo, mas essa pessoa esqueceu de preencher o campo sexo. Agora minha função na query e pegar o campo nome, caso ele termine com 'O' ele atualiza o campo sexo como Masculino, Caso termine com 'A' ele atualiza como Feminino. Entendeu?
Agradeço muito quem poder me ajudar nessa solução.
Abs a todos.
Todas as Respostas
-
Bruno,
Esta maneira não é 100% certa, pq existem nomes que nao terminal com O ou A e existem homem que terminam com A (Djalma)
segue o script
declare @teste as table (nome varchar(max)) insert into @teste values('Marcelo Fernandes') insert into @teste values('Maria Teste da Silva') insert into @teste values('Djalma Santos') select nome, case right(substring(nome,0,patindex('% %',nome)),1) when 'o' then 'M' when 'a' then 'F' Else '?' End as 'Sexo' from @teste
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
Bruno,
Fica muito complicado para o SQL Server analisar e determinar em quais posições do seu campo contém os caracteres desejados para realizar a comparação.
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA -
Não há uma regra de nome para classficar o sexo.
O que vc fizer nao irá resolver seu problema, a solução completa é ligar para o cliente e descobrir o sexo, e no banco nao permtir null no sexo, para dar erro e obrigar o preenchimento
Marcos -
Bruno, a sugestão do Marcelo funciona se você deseja atualizar por esse critério, mas não seria o ideal como o próprio exemplo do Marcelo (Djalma) demonstra.
Não sei qual o tamanho dessa sua base, mas talvez você tentar outras abordagens.
Faça um dicionário, use esse comando para extrair os nomes:
SELECT DISTINCT PrimeiroNome = CASE WHEN CHARINDEX(' ', Nome) > 0 THEN LEFT(Nome, (CHARINDEX(' ', Nome) - 1)) ELSE Nome END ,Sexo = CAST(NULL AS NCHAR(1)) INTO #nomes FROM dbo.tbl_Cadastro
Se não houver espaço no nome da pessoa, retorna o nome completo (para isso o case). Note que inclui um campo Sexo, dessa forma você avalia os nomes do dicionário e vai dando um UPDATE no campo Sexo naqueles que considera como Homem ou Mulher. Se houverem nomes que você estiver em dúvida, exclua-os desse dicionário.
Feito isso, basta montar um Update através do seu dicionário para atualizar o campo sexo, o comando pode ser assim:
UPDATE Cad SET Sexo = #nomes.Sexo FROM dbo.tbl_Cadastro AS Cad JOIN #nomes ON CASE WHEN CHARINDEX(' ', @Name) > 0 THEN LEFT(@Name, (CHARINDEX(' ', @Name) - 1)) ELSE @Name END = #nomes.PrimeiroNome
Note que tive que replicar o case da primeira query para que ele trouxesse o primeiro nome com a mesma lógica, mas você poderia fazer isso de outra forma, como com uma Coluna Computada na tabela de cadastro por exemplo, assim o código ficaria mais limpo.
Esse método talvez não resolva todos os seus nomes, mas pode ajudar a fazer uma boa limpeza no que esta errado, e dai o restante você como pode atualizar.
Espero que possa ser útil.
Obrigado.
Rafael Veronezi
Database Administrator | BI Analyst
Twitter: ravero
Blog: http://raver0.wordpress.com -
Boa tarde galera, eu retomei ao mesmo erro, devido as demandas tipo que parar essa base por esse tempo.
Bom tem como eu conseguir atualizar uma base que nao estar preenchico 250.000 mil nomes sem o campo sexo?
Pois agora estou com urgencia, caso alguem possa me ajudar agradecido mesmo.
Bem nada impossivel como dizem, mas e muito trabalho fazer isso tudo com uma base de 250.000 mil nomes. Me de alguma luz please..
thanks.
att -
Bruno,
Dizer que não tem é mentira, mas com certeza você terá um pouco de trabalho e além disso, poderá enfrentar problemas de lentidão se for você atualizar este quantidade de registro de uma única vez.
Teriamos que pensar em dimensionar este quantidade de atualizações por faixa de registros!!!!
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA -
-
Bruno,
Você separou os em branco do campo sexo e agora deseja utilizar este mesmos dados informando seus sexos?
Qual é o SQL Server que você esta utilizando?
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA -
-
update Tabela
set camposexo = case when right(replace(camponome,' ',''),1) = 'A' then 'FEMININO' when right(replace(camponome,' ',''),1) = 'O' then 'MASCULINO' else camposexo end
Assim ele vai alterar sexo quando o camponome terminar com 'A' ou 'O' e caso não termine com nenhuma das duas ele Mantem o valor do camposexo.
O Replace serve para não correr o risco do ultimo caracter ser um espaço em branco.
Espero ter ajudado.
-
Bom dia, Ceallopes
Agradeço pela sua ajuda, mas o que eu percebi nesta query está pegando qualquer parte, como exemplo Sobrenome, na query preciso pegar só o primeiro NOME e caso for A = F e O = M...
Estou rodando está query..
update tabela
set sexo = case right(substring(nome,0,patindex('% %',nome)),1)
when 'o' then 'M' when 'a' then 'F' Else 'I' END
Está atualizando, certinho só que ele tá colocando os Indefinido os que termina com R, L, S e etc. Preciso só atribuir os que estão em branco e nesta condição se FOR A = F e O = M...
Agradeço mesmo pela ajuda.
Att. -
Bruno criei um script para atualizar primeiro rode na base e verifique o resultado
se for satisfatório comente a linha do insert e a do select no final e retire o comentário a linha do update alterando tanto o update quanto o select do cursor para a tabela desejada.
Declare @cString VarChar(Max) Declare @cNome VarChar(Max) Declare @cSexo Char(1) Declare @nPos Int Declare @Tmp Table (Nome VarChar(Max),Sexo Char(1)) Declare cCursor cursor For Select Nome From Nome Where Sexo = ' ' -- Altere aqui para pegar a tabela desejada Open cCursor Fetch From cCursor Into @cNome While @@Fetch_Status = 0 Begin Set @cString = @cNome Set @nPos = CharIndex(' ',@cString)-- pego a posição do espaço Set @cString = SubString(Substring(@cString,@nPos-1,Len(@cString)),1,1) -- Toda a logica se resumi aqui onde eu pego o 1º espaço e com base nisso eu pego somente a ultima letra antes do espaço --Depois disso verifico se é Masculino ou Feminno If Upper(@cString) In ('A','O') Begin If Upper(@cString) = 'A' Begin Set @cSexo = 'F' End If Upper(@cString) = 'O' Begin Set @cSexo = 'M' End End --Update Nomes Set Sexo = @cSexo Where Current Of cCursor --altere aqui para fazer update na tabela desejada Insert into @Tmp Values(@cNome,@cSexo) Fetch Next From cCursor Into @cNome End Close cCursor Deallocate cCursor Select * From @Tmp
Espero ter ajudado..
Att,
Fernando Willian de Souza Furtado
Se útil classifique obrigado...