domingo, 29 de junho de 2008

Banco de Dados dos Correios

Update: Um leitor decifrou minha explicação, e comentou como decodificar o Banco de Dados...

Comprei esses dias o Guia Postal Brasileiro 2007, bem interessante o programa, mas sua interface é horrível, não permite nem copiar endereços e CEP's, ou seja, é quase que a mesma coisa que acessar o site, só que rápido...

Dei uma olhada no sistema dele, e é um banco de dados Access com senha, pesquisei na intenet e descobrir onde achar a senha...

O que eu descobri é que ninguem sabe decodificar o campo CEP, mas achei em um fórum um cara que achou a chave para decriptografar. Se isso funciona ou não, não vem ao caso...

Eu tinha achado outra forma de decodificar o campo CEP, acredito que muito mais simples, mas ai depende, acredito na verdade que a decodificação nunca ou quase nunca é utilizada pelo programa, pois tal tarefa tornaria o funcionamento do programa inviável, tendo em vista que cada linha é um código único a ser decodificado...

O que ninguém percebeu ainda, é que, nem sempre o que queremos está onde achamos que o que queremos está......

A criptografia útil é quase que pré-histórica, mas ninguem a encontrou, não achei um relato sequer desse modelo de descriptografar o campo CEP...

Olhe o funcionamento do programa, e você perceberá algo que caso os campos fossem decodificados um a um seria impossível.

Não vou revelar o segredo para ver até quando alguém revela isso... Mas acho que quem descobre não publica o seu achado...

Mas fica uma dica, a decodificação é possível pelo próprio banco de dados, sem qualquer rotina criptografica, mas com uma série de comandos matemáticos (não necessariamente, mas fica mais rápido).

E não, ela não depende do Access, é totalmente independente.

Aos desavisados que procuram a senha do arquivo dbgpbe.mdb ela esta no arquivo GPBE.udl, «¹½¿¥Ð²þÞ¢§³¼» Sem os espaços ao redor...

45 comentários:

Unknown disse...

Se vc tem dó de publicar seu trabalho, eu faço por vc então.

Depois de virar a internet de ponta cabeça e achar umas 3 soluções que não funcionam, resolvi eu mesmo decifrar na unha a base de dados dos Correios.
A lógica é inegável. Porém não usei a coluna criptografada e sim a [LOG_KEY_DNE].

Requesitos: Nenhum!!! Não importa de que ano é a base.

Não, não precisa de programa, nem código, nem conhecimento de lógica de programação(caso queira fazer um a um).
Nada além de lógica.
Demorei um dia inteiro pra catalogar a metade das informações e outro dia inteiro pra achar o resto da lógica pra completar as lacunas vazias.
Na tabela principal [LOG_LOGRADOURO], onde vc achar coluna com nome [LOG_KEY_DNE] ou qq outra coluna que contenha valores tipo esse "2ABKV5CND3DIGUQH" faça o seguinte.

Separe essa "tripa" de caracteres em pares.
Ficaria assim:
2A-BK-V5-CN-D3-DI-GU-QH
Cada par refere-se a um número dos 8 que contem o CEP.
Use a tabela que irei postar mais abaixo para trocar os pares de caracteres pelos números correspondentes.
PRONTO!!!! Dificil?
Crie uma coluna nova nas tabelas, crie funções ou rotinas e aplique para todas as linhas.
Agora seu banco está com o CEP descriptografado.
E o melhor de tudo. Se os Correios lançarem outra base de dados, a lógica continuará a mesma.

É isso. Bom proveito!!!

TABELA:
X8 1
Z0 2
1B 3
3D 4
4C 5
2A 6
09 7
Y7 8
5V 9
UG 0
CN 1
EP 2
GR 3
ID 4
JS 5
HQ 6
FO 7
DM 8
BK 9
AL 0
8X 1
0Z 2
B1 3
D3 4
C4 5
A2 6
90 7
7Y 8
V5 9
GU 0
NC 1
PE 2
RG 3
DI 4
SJ 5
QH 6
OF 7
MD 8
KB 9
LA 0

Se essa informação fosse normalizada em todas as base dados seria muito mais fácil migrações.
E só por esse motivo resolvi postar a lógica pra descriptografar os CEPs da base dos correiros.
Não teria conseguido sem sua dica.
Obrigado.
FelipeTv.

Otavio Y. A. Diniz disse...

Parabéns, FelipeTv...
É a primeira pessoa que eu vejo que decifrou por esse meio também...

Olsen Rodrigo (Pikachu) disse...

A informação foi feita para ser divulgada, se vc possui a informação e segura apenas pra si torna-se tão medíocre quanto aqueles que restringiram ela.

Otavio Y. A. Diniz disse...

A solução do problema é tão simples que não vi motivo para publicá-la...
As pessoas só não a encontravam por terem preguiça de procurar...

Unknown disse...

Parabéns Felipe. Obrigado pela solução.

Daniel Medina disse...

Felipe, eu gostarida de lhe enviar o meu MUITO OBRIGADO!

Essa sua tabela me poupou HORAS de trabalho.

Viktor disse...

Vlw Felipe , seu trabalho realemnte te destacou entre os outros, nao segue a linha do (Otario) ops Otavio, como Olsen disse , a informacao foi feita para ser divulgada.

Unknown disse...

Galera... a coisa está caminhando para o lado errado.

Achei a solução graças a dica do Otávio.
Concordo com ele quando ele diz que as pessoas tem preguiça de procurar.
Postei a informação por dois motivos básicos:

1 - Vi muito esperto ganhando dinheiro fácil pra descriptografar essa base.
2 - Os Correios é uma estatal. E esses dados deveriam ser de conhecimento público. Ou seja, ninguém deveria pagar pra saber os CEPs do Brasil.
http://pt.wikipedia.org/wiki/Empresa_Brasileira_de_Correios_e_Tel%C3%A9grafos

Explicação:
1 - Esses espertos, fizeram o dever de casa e conseguiram decifrar a base.(Não importa a maneira mas aposto que deu trabalho). E por ter dado trabalho, se acham no direito de cobrar por isso(e com razão). Mas se o primeiro já tivesse postado a forma de decifrar, não teríamos tanta gente queimando a "mufa" pra criar um código pra descriptografar e se achando no direito de cobrar pra isso.

2 - Esses desgraçados estão perdendo terreno para empresas estrangeiras como FEDEX, DHL, etc, e por isso querem arrancar dinheiro de qq lado pra justificar abusos como responsáveis de unidade andando de Land Hover.
Se vc for ao Correio e pedir o CEP de um endereço ele te darão. Então porque não dar da base inteira?

Pra mim isso é abuso. E toda oportunidade que eu tiver de ser um calo nos abusadores, tenham certeza que estarei lá. Causando dor e raiva.

Sendo assim, se querem elogiar, ok.
Mas sem faltar com respeito aos outros colegas.
Lembrem-se que vc´s só tem essa matéria publicada pq o Otávio resolveu dar a dica.

Enjoy.

SSGINFO disse...

É ISSO AI RAPAZIADA, ESTOU MONTADO UMA BASE DE DADOS DE CEP 2009 EM PARADOX, E COM ESTAS INFORMAÇÕES ASSIM QUE CONSEGUIR MONTAR O ARQUIVO, VOU DISPONIBILIZAR A TODOS SEM QUALQUER CUSTO.

UM GRANDE ABRAÇO A TODOS,
SÉRGIO GOMES

ssginformatica@gmail.com

SSGINFO disse...

JA CONSEGUI GERAR O ARQUIVO COMPLETO, ESTAREI DISPONIBILIZANDO A PARTIR DE HOJE NA PAGINA ssg-informatica.blogspot.com, ARQUIVO EM PARADOX, MAS QUE PODE SER IMPORTADO PARA OUTRAS BDs.

ESPERO QUE SEJA UTIL.

SÉRGIO GOMES
ssginformatica@gmail.com
SKYPE: SSGINFORMATICA

Unknown disse...

Olá a todos e agradecimentos em especial ao Felipe pela grande sacada na combinação do campo [LOG_KEY_DNE], utilizando esse input e alguns updates no Access, conseguir criar uma rotina de atualização do campo cep e ao final descriptografar todas tabelas. Quem tiver interesse de receber o bd atualizado de 2010, por favor, me mandem um e-mail/msn: typebr@hotmail.com, o CD eu recebi no dia 24/05/2010.

Unknown disse...

Olá, Desculpa a demora segue o link do mdb com 186mb.



http://www.megaupload.com/?d=Q19D6VPE



ARJ

Unknown disse...

Pessoal, acabei de testar a base de 2010 e a regra de identificação continua a mesma.

Bom proveito.

Allyson Cavalcanti disse...

Pessoal, para aqueles como eu que curtem o banco de dados postgreSQL, segue uma função abaixo que faz o serviço. Obrigado Felipe pela sua contribuição em resolver o problema.

Create or Replace Function fncdecryptcep(argkeydne varchar) Returns varchar AS $fncdecryptcep$
Declare
decryptedcep varchar := '';
Begin
For i In 1..length($1) By 2 Loop
Case substr($1,i,2)
When 'X8','CN','8X','NC' Then
decryptedcep := decryptedcep || 1;
When 'Z0','EP','0Z','PE' Then
decryptedcep := decryptedcep || 2;
When '1B','GR','B1','RG' Then
decryptedcep := decryptedcep || 3;
When '3D','ID','D3','DI' Then
decryptedcep := decryptedcep || 4;
When '4C','JS','C4','SJ' Then
decryptedcep := decryptedcep || 5;
When '2A','HQ','A2','QH' Then
decryptedcep := decryptedcep || 6;
When '09','FO','90','OF' Then
decryptedcep := decryptedcep || 7;
When 'Y7','DM','7Y','MD' Then
decryptedcep := decryptedcep || 8;
When '5V','BK','V5','KB' Then
decryptedcep := decryptedcep || 9;
When 'UG','AL','GU','LA' Then
decryptedcep := decryptedcep || 0;
Else
Return Null;
End Case;
End Loop;
Return decryptedcep;
End;
$fncdecryptcep$ Language plpgsql;

Comment On Function fncdecryptcep(argkeydne varchar) Is 'Função para Descriptografar os CEPs do Banco de Dados do DNE';

Unknown disse...

O campo CEP(nvarchar(16)) na mesma tabela LOG_LOGRADOURO, onde esta o campo LOG_KEY_DNE, tambem esta criptografado, só que com uma criptografia diferente, não funciona esse algoritmo, alguem sabe a função desse campo, já que o LOG_KEY_DNE, já traz o número do CEP ?

Otavio Y. A. Diniz disse...

O objetivo é confundir...

Esse campo CEP possui o número do CEP criptografado com uma criptografia mais avançada...

O que exigiria muito tempo para encontrar a chave de decodificação...

Aqui explica como descriptografar o campo CEP -> http://www.babooforum.com.br/forum/index.php?/topic/535423-ceps-correios/

Mas basicamente é para confundir e despistar...

Theo disse...

Alguém sabe onde baixo o GPBe de 2011?
Não necessariamente descriptografado. Quero a base, mesmo.
Obrigado.

Otavio Y. A. Diniz disse...

Na loja virtual dos Correios da para comprar.

Juliano disse...

opa pessoal acabei de testar com a ultima versao dos correios 07/07/2011 e não funcionou os ceps não batem, alguem ja testou ou teve exito com a nova versao ?

Otavio Y. A. Diniz disse...

Esquisito eu to com a versão de 05/10/2011 aqui, ela ainda ta com a mesma chave das outras...

Juliano disse...

se quise eu posto o link para voces baixarem para ver, porque esta assim no banco a primeira linha
Rua Nelson Mesquita
2ABKV5CND3RGC4QH
2A-BK-V5-CN-D3-RG-C4-QH
6-9-9-1-4-3-5-6

Gerando o cep 69914-356
este cep é de

Rua Benjamim Constant
Calafate
Rio Branco
AC
69914-356


Pergunto sera que eu fiz algo errado ou entedi algo errado ?

Otavio Y. A. Diniz disse...

Realmente há uma diferença nos CEPs, mas o programa da versão 1103 explica:

"Senhor usuário,

A partir da publicação da Base de Dados do DNE (versão 1103), em outubro/2011, o cadastro
dos logradouros e CEPs da cidade de Rio Branco, no Acre, foi atualizado e passou de 890
(oitocentos e noventa) para 3.244 (três mil duzentos e quarenta e quatro) registros.
Para a atualização acima foi necessário ampliar a faixa de CEP da cidade Rio Branco,
conforme demonstrado abaixo:

UF Cidade Faixa de CEP Data da
De: Para: Publicação
AC Rio Branco 69900-000 a 69920-999 69900-001 a 69923-999 01/11/2011

Para permitir a expansão da faixa de CEP de Rio Branco, foi necessário alterar os CEPs das
localidades de Bujari, Capixaba e Porto Acre, conforme descrito a seguir:

UF Localidade CEP Data da
De: Para: Publicação
AC Bujari 69923-000 69926-000 01/11/2011
Capixaba 69922-000 69931-000
Porto Acre 69921-000 69927-000

Diante da nova situação, solicitamos observar os novos CEP's quando do endereçamento de
objetos postais a serem enviados às cidades citadas, com vistas a evitar que ocorram
divergências entre os CEP's divulgados pela ECT (DNE - Versão 1103) com o informado nos
objetos postais."

Juliano disse...

então e isso mesmo, ta certo vlw mesmo, obrigado

lminervino disse...

Olá, alguém sabe para que serve o campo 'BAI_NU_SEQUENCIAL_FIM' na tabela log_logradouro? Mesmo porque no campo 'BAI_NU_SEQUENCIAL_INI' já consta os índices da tabela log_bairro. Bem, estou com esta pulga atrás da orelha, espero receber alguma luz.
Obrigado.

Programador Orgânico disse...

Saudações,

para quem já converteu a base de dados do Acess para MSSQL e quiser segue uma função para resolver a tripa ali de cima:


if object_id('Tripa') is Not Null drop view Tripa;
GO
create view Tripa( C, D )
as
select 'X8', '1'
union all select 'Z0', '2'
union all select '1B', '3'
union all select '3D', '4'
union all select '4C', '5'
union all select '2A', '6'
union all select '09', '7'
union all select 'Y7', '8'
union all select '5V', '9'
union all select 'UG', '0'
union all select 'CN', '1'
union all select 'EP', '2'
union all select 'GR', '3'
union all select 'ID', '4'
union all select 'JS', '5'
union all select 'HQ', '6'
union all select 'FO', '7'
union all select 'DM', '8'
union all select 'BK', '9'
union all select 'AL', '0'
union all select '8X', '1'
union all select '0Z', '2'
union all select 'B1', '3'
union all select 'D3', '4'
union all select 'C4', '5'
union all select 'A2', '6'
union all select '90', '7'
union all select '7Y', '8'
union all select 'V5', '9'
union all select 'GU', '0'
union all select 'NC', '1'
union all select 'PE', '2'
union all select 'RG', '3'
union all select 'DI', '4'
union all select 'SJ', '5'
union all select 'QH', '6'
union all select 'OF', '7'
union all select 'MD', '8'
union all select 'KB', '9'
union all select 'LA', '0'
GO
if object_id('DesTripa') is Not Null drop function DesTripa;
GO
create function DesTripa( @str as varchar(128) )
returns varchar(128)
as
begin

declare @dois varchar(2), @result varchar(128)

set @result = ''
while len(@str) > 0 begin

select @dois = left( @str, 2 )
select @str = substring( @str, 3, len(@str)-2 )
select @result = @result + Tripa.D from tripa where c = @dois

end

return @result
end
GO

select Log_KEY_DNE
, dbo.DesTripa( Log_KEY_DNE )
, *
from LOG_LOGRADOURO
where LOG_NO like '%pommery%'

alex disse...

Galera, segue abaixo uma FUNCTION SQLServer para fazer o UPDATE direto dentro do banco:


create Function ST_FN_DECRYPTCEP(@vARGKEYDNE nvarchar(32)) Returns varchar(8)
as
begin
declare @vDECRYPTEDCEP varchar(8)
declare @vKeyDNE nvarchar(32)
declare @vWord varchar(2)

set @vDECRYPTEDCEP = ''
set @vKeyDNE = @vARGKEYDNE

while (len(@vKeyDNE) > 0)
begin
set @vWord = upper(left(@vKeyDNE,2))
set @vKeyDNE = right(@vKeyDNE,len(@vKeyDNE)-2)

if charindex(@vWord, 'X8CN8XNC') > 0
set @vDECRYPTEDCEP = @vDECRYPTEDCEP + '1'
if charindex(@vWord, 'Z0EP0ZPE') > 0
set @vDECRYPTEDCEP = @vDECRYPTEDCEP + '2'
if charindex(@vWord, '1BGRB1RG') > 0
set @vDECRYPTEDCEP = @vDECRYPTEDCEP + '3'
if charindex(@vWord, '3DIDD3DI') > 0
set @vDECRYPTEDCEP = @vDECRYPTEDCEP + '4'
if charindex(@vWord, '4CJSC4SJ') > 0
set @vDECRYPTEDCEP = @vDECRYPTEDCEP + '5'
if charindex(@vWord, '2AHQA2QH') > 0
set @vDECRYPTEDCEP = @vDECRYPTEDCEP + '6'
if charindex(@vWord, '09FO90OF') > 0
set @vDECRYPTEDCEP = @vDECRYPTEDCEP + '7'
if charindex(@vWord, 'Y7DM7YMD') > 0
set @vDECRYPTEDCEP = @vDECRYPTEDCEP + '8'
if charindex(@vWord, '5VBKV5KB') > 0
set @vDECRYPTEDCEP = @vDECRYPTEDCEP + '9'
if charindex(@vWord, 'UGALGULA') > 0
set @vDECRYPTEDCEP = @vDECRYPTEDCEP + '0'

end
return @vDECRYPTEDCEP
end

Unknown disse...

Bem, as coisas não são tão fáceis assim... Para descobrir o número do CEP a partir do KEY_DNE até que é fácil mas e se você não tem o KEY_DNE? No caso da tabela de CAIXA POSTAL COMUNITÁRIA não tem dados no KEY_DNE... daí precisa descriptografar o CEP mesmo pelo sistema TwoFish (se não me engano). Outro problema: para você pegar um número do CEP e tentar gerar uma KEY_DNE (ou seja, o inverso), tem que ter uma certa rotina, eu tentei com 1 e 3 = bloco 1 / 2 e 4 = bloco 2 / 5 e 7 = bloco 3 / 8 = bloco 4 Isso funcionou para a MAIORIA mas maioria não é TODOS. Isso quer dizer que tem algo mais no esquema, que não sei qual é mas de qualquer maneira tem que descriptografar e descriptografar mesmo para poder ter acesso a TODOS os dados e poder usar para valer. Alguma idéia?

Otavio Y. A. Diniz disse...

Bom dia Unknow, a tabela Caixa Postal Comunitária possui sim um campo CPC_KEY_DNE, talvez seja um problema com a sua tabela, ou eles retiraram em uma versão mais nova do DB.

Agora a rotina para recuperar o número via DNE é simples você divide o código em pares e cada par é um número, como já foi explicado nos comentários dos leitores acima.

Unknown disse...

Otavio e Felipe,
Fantastico a iniciativa de compartilhar o código.

Não tenho conhecimento para aproveitar 100% desta informação.

mas necessito esse banco de dados em excel ou csv, para atualizar as informações na empresa.

se alguém tiver como disponibilizar essas informações nestes formatos ficarei muito agradecido.

Email para contato: euripedescruz@gmail.com

link do banco de dados 2013:

http://www.sendspace.com/file/hox4z1

Obrigado.

Unknown disse...

O meu problema é achar o LOGRADOURO pelo número do CEP (ou seja, o caminho inverso).

Deve ter uma lógica para isso pois para cada dígito há pelo menos 4 pares de código e a questão é saber qual é o par certo para cada dígito...

Alguém sabe qual é o esquema lógico para fazer isso?

O motivo que preciso disso é para poder fazer busca direto na base original que vem no CD.

Não tenho interesse em descriptografar nada, só quero substituir o programa original que vem no CD dos Correios pelo meu próprio que tem opções melhores de busca para o meu caso específico.

Obrigado pela ajuda

Raphael disse...

class Program
{
static void Main(string[] args)
{
string cepCriptografado = "2ABKV5CND3DIGUQH";

string cepDescriptografado = DescriptografarCep(cepCriptografado);

Console.WriteLine("Criptografado = {0} Descriptografado = {1}", cepCriptografado, cepDescriptografado);

Console.WriteLine("Criptografado = {0} Descriptografado Formatado = {1}", cepCriptografado, Convert.ToInt32(cepDescriptografado).ToString("00000-000"));

Console.ReadLine();
}

private static string DescriptografarCep(string cepCriptografado)
{
StringBuilder sbCepDescriptografado = new StringBuilder();

if (!string.IsNullOrEmpty(cepCriptografado))
{
foreach (Match mchParteDoCep in Regex.Matches(cepCriptografado, @"\w{2}"))
{
sbCepDescriptografado.Append(DescriptografarParteDoCep(mchParteDoCep.Value));
}

}
return sbCepDescriptografado.ToString();
}

private static string DescriptografarParteDoCep(string valor)
{
if (valor == "AL" || valor == "GU" || valor == "LA" || valor == "UG")
{
return "0";
}
else if (valor == "8X" || valor == "CN" || valor == "NC" || valor == "X8")
{
return "1";
}
else if (valor == "0Z" || valor == "EP" || valor == "PE" || valor == "Z0")
{
return "2";
}
else if (valor == "1B" || valor == "B1" || valor == "GR" || valor == "RG")
{
return "3";
}
else if (valor == "3D" || valor == "D3" || valor == "DI" || valor == "ID")
{
return "4";
}
else if (valor == "4C" || valor == "C4" || valor == "JS" || valor == "SJ")
{
return "5";
}
else if (valor == "2A" || valor == "A2" || valor == "HQ" || valor == "QH")
{
return "6";
}
else if (valor == "09" || valor == "90" || valor == "FO" || valor == "OF")
{
return "7";
}
else if (valor == "7Y" || valor == "DM" || valor == "MD" || valor == "Y7")
{
return "8";
}
else if (valor == "5V" || valor == "BK" || valor == "KB" || valor == "V5")
{
return "9";
}
return null;
}
}

Unknown disse...

Acho que não fui claro... não quero saber como fazer para converter 2ABKV5CND3DIGUQH no equivalente número de CEP...

O que eu quero saber é como converter o número do CEP no código 2ABKV5CND3DIGUQH

A dificuldade é que existem várias combinações de pares para cada número.

Por exemplo o número 1 tem os seguintes pares: 'X8', 'CN', '8X', 'NC' então eu pergunto... qual par usar para aquele número CEP em particular que vai corresponder exatamente ao que se encontra na base de CEP???

Será que está claro o que eu queria saber? É o inverso de decodificar... eu quero é codificar, mas tem que ser no mesmo esquema que está na base dos Correios.

Unknown disse...

Poxa... parece que minha pergunta de fazer o caminho inverso é mais difícil que descobrir como descriptografar... sera que ninguém vai conseguir resolver esse desafio?
Bem, minha solução é fazer uma busca aninhada para usar todas possibilidades... ou seja, um monte de SELECT... isso não é nada eficiente e vai exigir muito processamento mas funciona... já que não tem ninguém capaz de resolver o caminho inverso... fazer o que?

Otavio Y. A. Diniz disse...

Unknow talvez haja um padrão na cifra utilizada, mas isso demandaria uma análise mais detalhada dela.
O mais simples seria vc cria um campo descriptografado e pesquisa por ele...

Unknown disse...

Olá Otavio, obrigado por responder.
A questão é que eu não queria criar um campo descriptografado mas usar a base original sem tocar nela... o ideal seria saber qual é esse padrão na cifra utilizada... mas vou continuar pesquisando.
Se alguém descobrir não deixe de me deixar saber... obrigado

Otavio Y. A. Diniz disse...

Uma solução para vc seria pesquisar assim:

select * from log_logradouro where substr(LOG_KEY_DNE,1,2) IN ("2A","A2") AND substr(LOG_KEY_DNE,13,2) IN ("2A","A2") LIMIT 10;

o IN faria a pesquisa das diferentes variações, e o substr limitaria os códigos na pesquisa...

Estou sem tempo para fazer um exemplo inteiro, mas é basicamente isso.

Unknown disse...

haja processamento... mas pode deixar que eu vou "arrumar" um jeito alternative aqui.
Obrigado de qualquer maneira...

Otavio Y. A. Diniz disse...

Bom, fiz uma analise prévia dos códigos e achei o seguinte padrão.

Nos cinco primeiros números do CEP, há um único par de letras usando em cada campo. Esse é o padrão do 0...
AL - UG -AL - AL - GU
Não encontrei as outras combinações dentro do mesmo campo...
Assim, é só achar o par padrão para cada campo e pronto.

O problema são os 3 últimos números, do zero ficou assim
LA e AL
UG e GU
LA e AL

Com isso você poderia reduzir a busca para 2^3 = 8 combinações possíveis...

Otavio Y. A. Diniz disse...

Código para localizar as combinações:
select * from log_logradouro group by substr(LOG_KEY_DNE,1,2);

Unknown disse...

Atenção Otavio... isso não é válido... somente para os 4 primeiros dígitos pois o quinto é outro caso e isso se você estiver apenas observando a tabela LOG_LOGRADOUROS, eu nem cheguei a verificar nas outras ainda...

Otavio Y. A. Diniz disse...

Realmente, eu to sem tempo pra testar isso, mas deve ter algum padrão...
Se eu tiver tempo eu tempo encontrar

Unknown disse...

Não tem problema algum.
Eu estou meio sem tempo também mas vou fazer aos pouquinhos até ver se encontro algo lógico e eficiente. Observei que o próprio programa dos Correios é lento na procura pelo CEP o que indica que não deve ter uma forma mais eficiente... mas como você mesmo indicou parece ser o caminho.
De qualquer maneira eu agradeço o seu retorno e pode ficar tranquilo, eu vou me "divertir" por aqui fazendo mais uns testes e quem sabe descubro algo novo. Por enquanto a forma é aquela mesma com IN( x, y ) e ir montando desta maneira.
Obrigado pela atenção dispensada e bom final de semana.

Unknown disse...

bom dia a todos, alguém consegui fazer a interligação das bases para gerar uma base somente? tenho a ultima versão do CEP mas não estou conseguindo coo relacionar os campos.

Unknown disse...

Olá Fernanda,

Ainda não fiz isso mas não é complicado fazer, demanda apenas TEMPO e um pouco de dedicação.

Você tem a última base dos correios ou o último CD do GPBe (último)?
Tem como você disponibilizar para nós?
Obrigado

João Labrego disse...

Fiz essa função em MySQL, mas o interessante dela é que usei uma string.

CREATE FUNCTION ObterCEP(valor VARCHAR(100)) RETURNS CHAR(100)
BEGIN
DECLARE mascara VARCHAR(120);
DECLARE retorno CHAR(100);
DECLARE digito CHAR(2);
DECLARE posicao INT;
DECLARE indice INT;

SET mascara = "X8;Z0;1B;3D;4C;2A;09;Y7;5V;UG;CN;EP;GR;ID;JS;HQ;FO;DM;BK;AL;8X;0Z;B1;D3;C4;A2;90;7Y;V5;GU;NC;PE;RG;DI;SJ;QH;OF;MD;KB;LA";
SET retorno = "";
SET posicao = 1;
WHILE (posicao < LENGTH(valor)) DO
SET digito = SUBSTRING(valor, posicao, 2);
SET indice = INSTR(mascara, digito);
IF indice > 0 THEN
SET indice = FLOOR(indice / 3 + 1) MOD 10;
SET retorno = CONCAT(retorno, CAST(indice AS CHAR(1)));
END IF;
SET posicao = posicao + 2;
END WHILE;

RETURN retorno;
END