Mais

Removendo seletivamente o espaço em branco de uma string com SQL

Removendo seletivamente o espaço em branco de uma string com SQL


Tenho duas colunas de endereços que preciso juntar. A coluna 1 tem os endereços formatados como "Alguma rua 12 A", enquanto a coluna 2 os tem formatados como "Alguma rua 12A".

Ou seja, o último espaço em branco entre 12 e A é removido em uma das colunas. É possível escrever uma condição SQL que reconheça o espaço em branco após um número ao fazer uma junção de banco de dados?

Não posso contar os espaços em branco, pois alguns nomes de ruas têm espaços em branco e outros não.

Se você tiver uma solução específica de software, eu tenho acesso ao QGIS e ArcGIS Desktop (licença mais básica, qualquer que seja o nome no momento). Se você tiver uma solução em qualquer um desses pacotes de software, mesmo que não use SQL, isso é bem também.


No QGIS, você pode tentar limpar sua coluna com caracteres espaçados usandoregexp_replace ('Alguma rua 12 A', ' s ([0-9] +) s w', ' 1')via calculadora de campo. Você terá que substituir'Alguma rua 12 A'com sua coluna:

deve estar funcionando. Espero que isto ajude.


Em SQL, supondo que seu banco de dados suporte expressões regulares, você poderia fazer algo como o seguinte (exemplo postGres). Algo semelhante no oracle também deve funcionar. T-SQL é um pouco mais complicado porque não tem expressões regulares.

ATUALIZAR algumaTabela SET someCol = regexp_replace (someCol, '( m [0-9] +)  M [] +  m ([az] +)  M', ' 1  2', 'gi') ONDE algumaCol ~ * ' m [0-9] +  M [] +  m [az] +  M'

Uma rápida explicação da expressão regular

 m Início da palavra ([0-9] +) 1 ou mais números, salvo  M Fim da palavra [] + 1 ou mais espaços  m Início da palavra ([az] +) 1 ou mais letras, salvo  M Fim da palavra

A expressão de substituição é a primeira e a segunda expressões salvas e o'gi'indica substituição global, sem distinção entre maiúsculas e minúsculas.

Portanto, esta expressão removerá apenas os espaços entre inteiros completos e palavras apenas com letras.

12 A -> 12A 1A B -> 1A B A1 B -> A1 B 12 3 -> 12 3 12 A3 -> 12 A3

Todo endereço termina no formato '12 A 'ou' 12A '? Nesse caso, você pode dividir em espaços em branco (o padrão, pelo menos em python) e, em seguida, testar o último elemento para ver se ele contém dígitos ou não. Combine os dois últimos elementos se o último elemento for um caractere alfa simples. Isso também pode funcionar testando o comprimento do último elemento, desde que o último elemento de um endereço que seja uma letra seja apenas um caractere e a condição anterior (todos '12 A 'ou' 12A ') seja atendida.

# No ArcGIS Field Calculator # dividir o campo de endereço addresslist = address.split () # verificar se o último elemento é apenas um caractere (s) alfabético (s) - sem números se a lista de endereços [-1:]. Isalpha (): # construir um novo endereço aqui a partir de lista de endereços de acordo com seus requisitos # isso deve ajudá-lo a começar. Poste de volta se precisar de ajuda com esta parte.

Você pode tentar substituir no Python, removendo todos os [0… 9] seguidos de um espaço.

def RemoveWhiteAfterNumber (addressField): a = addressField para i no intervalo (10): a = a.replace (str (i) + "", str (i)) retorna um RemoveWhiteAfterNumber (! addressField!)

Na maioria dos conjuntos de dados do mundo real, a variação específica que você descreve é ​​apenas a ponta de um iceberg. Normalmente, você descobrirá todos os tipos de variações que acabarão por invalidar qualquer correspondência exata ou solução de código / regex com script. Portanto, eu usaria um algoritmo Fuzzy Lookup para esse requisito.

Se o volume de dados for pequeno e a tarefa for "única", eu usaria o Suplemento Fuzzy Lookup para Excel:

http://www.microsoft.com/en-au/download/details.aspx?id=15011

Se você precisar de uma solução mais escalonável e / ou automatizada, eu usaria a transformação Fuzzy Lookup no SQL Server Integration Services:

http://msdn.microsoft.com/en-us/library/ms137786.aspx

Ambos os componentes podem fornecer a "melhor" correspondência aproximada ou uma lista dos principais candidatos, cada um com pontuações de similaridade e confiança.

A "arte" está em filtrar, classificar e revisar os resultados. Normalmente tento definir limites mínimos de confiança e semelhança e aceitar automaticamente a melhor correspondência com uma pontuação acima desses limites. Inevitavelmente, existem alguns casos limítrofes que precisam de revisão manual.


Eu retiro os espaços de um campo para a geração do atlas para evitar que o GDAL tenha um ataque cardíaco ao vê-los durante uma conversão em lote.

Em vez de MAP_NAME, apenas uso substituir (MAP_NAME, ", '_')