Consultando caracteres sublinhados no ArcMap?


10

Para uma consulta LIKE padrão em uma classe de recurso ArcSDE baseada em Oracle, o caractere sublinhado representa um caractere curinga de um caractere quando usado com uma sequência.

Estou tentando impor uma consulta de definição para encontrar uma sequência de texto que comece com 4 dígitos exatamente seguidos por um caractere sublinhado.

Alguém sabe como eu especificaria um caractere sublinhado em uma consulta ou se / qual o caractere de escape?

A resposta do MDHald funciona para geodatabases, mas meu caso é específico do Oracle. Falsamente assumiu que o ArcSDE e a consulta de geodatabase do arquivo funcionariam da mesma forma neste caso.


O caractere de escape geralmente é uma barra invertida \ - acredito que esse também é o caso do Oracle, portanto, você deve procurar \_se estiver procurando pelo sublinhado.
Midavalo

@ Midavalo, essa foi a primeira coisa que veio à mente. Minha consulta foi CABLE = '_____ \ _%', que retornou zero resultado.
Eok

você pode precisar usar LIKE(embora você mencione LIKE na sua pergunta) - CABLE LIKE '____\_%'. Eu vou ter um jogo aqui, embora eu estou usando SQL Server em vez da Oracle, pode obter resultados diferentes
Midavalo


1
@Midavalo, encontrou exatamente a mesma coisa logo depois que você fez
Eok

Respostas:


7

Conseguiu rastrear a resposta.

Você pode especificar um caractere ESCAPE na consulta, como:

MY_FIELD COMO '____ $ _%' ESCAPE '$'

Isso procurará exatamente 4 caracteres, seguidos por um caractere de sublinhado, além de qualquer outra coisa depois disso.

Encontrei a documentação nesta página: http://desktop.arcgis.com/en/arcmap/10.3/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm

Não tenho certeza de quanto tempo atrás ou para quais versões isso é válido, mas funciona para o ArcGIS Desktop 10.3.

Trecho da documentação:

x [NÃO] COMO y [ESCAPE 'caractere de escape']

Use o operador LIKE (em vez do operador =) com curingas para criar uma pesquisa parcial de cadeias. O símbolo de porcentagem (%) 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 um sublinhado (_). Se você precisar acessar dados não característicos, use a função CAST. Por exemplo, esta consulta retorna números que começam com 8 no campo inteiro SCORE_INT:

CAST ("SCORE_INT" COMO VARCHAR) COMO '8%'

Para incluir o símbolo ou sublinhado de porcentagem em sua sequência de pesquisa, use a palavra-chave ESCAPE para designar outro caractere como caractere de escape, o que indica que um sinal ou sublinhado de porcentagem real segue imediatamente. Por exemplo, essa expressão retorna qualquer sequência que contenha 10%, como 10% DISCOUNT ou A10%:

"QUANTIDADE" COMO '% 10 $ %%' ESCAPE '$'


3

Você precisará empregar CHAR_LENGTH e SUBSTRING para que isso funcione. Seria o seguinte:

CHAR_LENGTH ("yourfieldname") =5 AND SUBSTRING("yourfieldname", 1, 4) <> '_'

onde yourfieldname = o nome do seu campo.

Não exclua o "" no código. Copie como está e substitua apenas o texto yourfieldname.


Sua resposta funciona para bancos de dados geográficos de arquivos, mas eu não sabia que o DBMS subjacente seria tão exigente. O Oracle não gosta da consulta.
Eok

O Oracle fica um pouco complicado com [DATABASE]. [TABLENAME] exige esses pontos duplos. Se a consulta não funcionar como uma definição, você sempre poderá criar uma exibição (clique com o botão direito do mouse em seu banco de dados> selecione Novo> selecione Exibir>) em seu SDE (presumindo que você tenha uma configuração se estiver obtendo do Oracle) e depois escreva uma consulta semelhante.
MDHald

3

Encontrei estas perguntas e respostas que me ajudaram a resolver por que não consegui usar uma cláusula where em um cursor de pesquisa do ArcPy que poderia restringir o cursor apenas aos registros que continham sublinhado ( _) em um campo de texto específico.

Quando o encontrei, já havia desenvolvido um trecho de código para ilustrar o problema. Assim, em vez de desperdiçar esse esforço, adicionei a solução e agora a estou postando aqui para talvez ajudar um futuro visitante com o mesmo problema.

O teste usa um geodatabase de arquivo e foi executado no ArcGIS 10.2.2 for Desktop.

import arcpy

arcpy.CreateFileGDB_management(r"C:\Temp","test.gdb")
arcpy.CreateFeatureclass_management(r"C:\Temp\test.gdb","testFC")
arcpy.AddField_management(r"C:\Temp\test.gdb\testFC","testField","Text")
cursor = arcpy.da.InsertCursor(r"C:\Temp\test.gdb\testFC",["testField"])
cursor.insertRow(["ABCD"])
cursor.insertRow(["A_CD"])
cursor.insertRow(["XYZ"])
cursor.insertRow(["X_Z"])
del cursor

where_clause = "testField LIKE '%C%'"
print("Using where_clause of {0} to limit search cursor to print any values containing the letter C:".format(where_clause))
with arcpy.da.SearchCursor(r"C:\Temp\test.gdb\testFC",["testField"],where_clause) as cursor:
    for row in cursor:
        print(row[0])
print("This is the expected result :-)")

where_clause = "testField LIKE '%_%'"
print("\nUsing where_clause of {0} to limit search cursor to print any values containing an underscore (_):".format(where_clause))
with arcpy.da.SearchCursor(r"C:\Temp\test.gdb\testFC",["testField"],where_clause) as cursor:
    for row in cursor:
        print(row[0])
print("This is not what I was hoping for :-(")

where_clause = "testField LIKE '%$_%' ESCAPE '$'"
print("\nUsing where_clause of {0} to limit search cursor to print any values containing an underscore (_):".format(where_clause))
with arcpy.da.SearchCursor(r"C:\Temp\test.gdb\testFC",["testField"],where_clause) as cursor:
    for row in cursor:
        print(row[0])
print("This is what I was hoping for :-)")

A saída é:

>>> 
Using where_clause of testField LIKE '%C%' to limit search cursor to print any values containing the letter C:
ABCD
A_CD
This is the expected result :-)

Using where_clause of testField LIKE '%_%' to limit search cursor to print any values containing an underscore (_):
ABCD
A_CD
XYZ
X_Z
This is not what I was hoping for :-(

Using where_clause of testField LIKE '%$_%' ESCAPE '$' to limit search cursor to print any values containing an underscore (_):
A_CD
X_Z
This is what I was hoping for :-)
>>> 

1
Obrigado por isso ... desperdice tanto tempo em soluções e sintaxe de caracteres "especiais" ... espero que eu lembre de onde encontrá-lo na próxima vez em que aparecer.
Mike
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.