Eu quero selecionar todos os registros de uma tabela de geodatabase onde a string começa com uma letra, então tentei
SELECT *
FROM tbl_names
WHERE "name" LIKE '[A-Z]%'
Isso não retornou registros. Após algumas pesquisas, descobri que essa é a sintaxe do SQL Server. Eu não achava que isso seria um problema, até onde eu sei todas as versões do suporte ao SQL %
. Depois de examinar o arquivo de ajuda na criação de uma expressão de consulta , vi que a sintaxe correta é
SELECT *
FROM tbl_names
WHERE "name" >= 'A'
Como os nomes são todos cordas, meu primeiro instinto foi tentar LIKE
. Por que o >=
operador é usado em vez de LIKE
? Os intervalos curinga não são suportados no ArcMap?
arcmap
sql
arcgis-10.1
Cindy Jayakumar
fonte
fonte
0
vem depoisZ
(o habitual, eu acho) ou antesA
? Vários outros DBMSs não suportam esse tipo de funcionalidade; portanto, você precisa usar o conhecimento de coisas ligeiramente diferentes. Além disso, o que dizer dos caracteres minúsculos (ou tudo em maiúsculas)? E quanto aos caracteres que não são do inglês (não do AZ)?!z,?,0,0a,1,10,2,ant,A,Ant,z,Z
. Então, caracteres especiais, dígitos e letras (diferenciam maiúsculas de minúsculas).Respostas:
Os curingas em geral são suportados pelo ArcMap. Aqui está um extrato da ajuda que você recebe enquanto faz um 'Selecionar por Atributos':
Use o operador LIKE (em vez do operador =) para criar uma pesquisa de seqüência parcial. Por exemplo, essa expressão selecionaria Mississippi e Missouri entre os nomes de estado dos EUA:
"STATE_NAME" LIKE 'Miss%'
Você pode usar operadores maior que (>), menor que (<), maior que ou igual (> =), menor que ou igual (<=) e BETWEEN para selecionar valores de sequência com base na ordem de classificação. Por exemplo, esta expressão selecionará todas as cidades em uma cobertura com nomes começando pelas letras M a Z:
"CITY_NAME" >= 'M'
O<>
operador not equal ( ) também pode ser usado ao consultar seqüências de caracteres.Caracteres curinga Um caractere curinga é um símbolo especial que representa um ou mais caracteres.
Para qualquer dado baseado em arquivo, '%' significa que qualquer coisa é aceitável em seu lugar: um caractere, cem caracteres ou nenhum caractere. Como alternativa, se você deseja pesquisar com um curinga que represente um caractere, use '_'.
Por exemplo, essa expressão selecionaria qualquer nome começando com as letras Cath, como Cathy, Catherine e Catherine Smith:
"NAME" LIKE 'Cath%'
Mas essa expressão encontraria Catherine Smith e Katherine Smith:
"OWNER_NAME" LIKE '_atherine smith'
Os curingas que você usa para consultar bancos de dados geográficos pessoais são '*' para qualquer número de caracteres e '?' para um personagem.Caracteres curinga são exibidos como botões na caixa de diálogo de consulta. Você pode clicar no botão para inserir o curinga na expressão que está construindo. Apenas os caracteres curinga que são apropriados para a fonte de dados da camada ou tabela que você está consultando são exibidos.
Se você usar um caractere curinga em uma sequência com o operador =, o caractere será tratado como parte da sequência, não como curinga.
Com uma tabela unida, use curingas apropriados para o lado da união que você está consultando. Se a consulta se aplicar apenas aos campos na tabela de destino (a tabela do lado esquerdo), use os curingas da tabela de destino. Se a consulta se aplicar apenas a campos na tabela de junção (a tabela do lado direito), use os curingas da tabela de junção. Se a consulta envolver campos de ambos os lados da junção, use os curingas '%' e '_'.
Por exemplo, se você associar um arquivo dbf (a tabela de junção) a uma classe de recurso pessoal do GDB (a tabela de destino):
Use * para consultas que envolvem apenas campos pessoais do GDB.
Use% para consultas que envolvem apenas colunas dbf.
Use% para consultas que envolvam colunas de ambos os lados da tabela.
De acordo com isso: acho que os intervalos não são suportados; você precisa usar> e <, do jeito que você fez.
fonte
WHERE "name" LIKE '%substring%'
. Somente quando precisei procurar uma sequência em um formato específico, como uma expressão regular no formulário[0-9][0-9][A-Z]%
, percebi que ela não aceitaria intervalos curinga.Sim, você pode usar curingas nas instruções LIKE. Nunca usei intervalos via ArcMap, mas você está usando a sintaxe correta do ponto de vista do SQL Server.
Uma rápida palavra de aviso se você for usar o operador '> ='. O resultado disso será diferente dependendo do agrupamento definido. Isso pode alterar a forma como a classificação é realizada nos dados, por exemplo, se diferencia maiúsculas de minúsculas ou não. Portanto, em alguns casos, sua consulta retornará apenas valores que começam com letras maiúsculas e, às vezes, maiúsculas e minúsculas.
Consulte http://sqlblog.com/blogs/louis_davidson/archive/2007/05/20/sorting-and-case-sensitive-collations.aspx .
Além disso, se você estiver interessado apenas no primeiro caractere do campo, poderá usar
ao invés de
Isso pode ter benefícios de desempenho, se nada mais.
fonte
SUBSTRING
é improvável que o método aumente o desempenho, pois (geralmente) significa que quaisquer índicesname
ativados serão ignorados. Sim, você pode ter um custo mais alto para comparações (dados comprimentos de caracteres), mas a maioria das implementações que eu conheço retornaria após o primeiro caractere ser comparado de qualquer maneira ... duvido pessoalmente que qualquer otimizador seja escrito para perceber queSUBSTRING(column, 1, 1)
está retornando apenas o início da cadeia de caracteresupper
? No entanto, não estou preocupado com o caso deste exercício, mas seria bom ter em mente.