Vous recherchez un caractère de soulignement dans ArcMap?

10

Pour une requête LIKE standard sur une classe d'entités ArcSDE basée sur Oracle, le caractère de soulignement représente un caractère générique à caractère unique lorsqu'il est utilisé avec une chaîne.

J'essaie d'imposer une requête de définition pour trouver une chaîne de texte qui commence par 4 chiffres exactement suivis d'un caractère de soulignement.

Est-ce que quelqu'un sait comment je spécifierais un caractère de soulignement lui-même dans une requête ou si / quel pourrait être le caractère d'échappement?

La réponse de MDHald fonctionne pour les géodatabases fichier mais mon cas est spécifique à Oracle. On a supposé à tort qu'ArcSDE et la requête de géodatabase fichier fonctionneraient de la même manière dans ce cas.

Eok
la source
Le caractère d'échappement est généralement une barre oblique inverse \ - je pense que c'est également le cas avec Oracle, vous devriez donc rechercher \_si vous recherchez le trait de soulignement.
Midavalo
@Midavalo, c'est la première chose qui m'est venue à l'esprit. Ma requête était CABLE = '_____ \ _%', ce qui n'a donné aucun résultat.
Eok
vous devrez peut-être utiliser LIKE(même si vous mentionnez LIKE dans votre question) - CABLE LIKE '____\_%'. Je vais jouer ici même si j'utilise SQL Server plutôt qu'Oracle, donc je peux obtenir des résultats différents
Midavalo
1
Try CABLE LIKE '____\_%' ESCAPE '\'- from SQL reference for query expressions used in ArcGIS - Desktop Help
Midavalo
1
@Midavalo, a trouvé exactement la même chose juste après vous
Eok

Réponses:

7

Géré pour retrouver la réponse.

Vous pouvez spécifier un caractère ESCAPE dans la requête tel que:

MY_FIELD LIKE '____ $ _%' ESCAPE '$'

Cela recherchera exactement 4 caractères suivis d'un caractère de soulignement et de toute autre chose après cela.

Trouvé la documentation sur cette page: http://desktop.arcgis.com/en/arcmap/10.3/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm

Vous ne savez pas jusqu'où ou pour quelles versions cela est valide, mais cela fonctionne pour ArcGIS Desktop 10.3.

Extrait de la documentation:

x [PAS] COMME y [ÉCHAPPER 'caractère d'échappement']

Utilisez l'opérateur LIKE (au lieu de l'opérateur =) avec des caractères génériques pour créer une recherche de chaîne partielle. Le symbole de pourcentage (%) signifie que tout est acceptable à sa place: un caractère, cent caractères ou aucun caractère. Sinon, si vous souhaitez effectuer une recherche avec un caractère générique qui représente un caractère, utilisez un trait de soulignement (_). Si vous devez accéder à des données autres que des caractères, utilisez la fonction CAST. Par exemple, cette requête renvoie des nombres commençant par 8 dans le champ entier SCORE_INT:

CAST ("SCORE_INT" AS VARCHAR) COMME '8%'

Pour inclure le symbole de pourcentage ou le trait de soulignement dans votre chaîne de recherche, utilisez le mot clé ESCAPE pour désigner un autre caractère comme caractère d'échappement, ce qui indique à son tour qu'un signe de pourcentage réel ou un trait de soulignement suit immédiatement. Par exemple, cette expression renvoie toute chaîne contenant 10%, telle que 10% de RÉDUCTION ou A10%:

"AMOUNT" LIKE '% 10 $ %%' ESCAPE '$'

Eok
la source
3

Vous devrez utiliser CHAR_LENGTH et SUBSTRING pour que cela fonctionne. Il ressemblerait à ceci:

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

où yourfieldname = le nom de votre champ.

Ne supprimez pas le "" dans le code. Copiez tel quel et remplacez uniquement le texte votrenom.

MDHald
la source
Votre réponse fonctionne pour les géodatabases fichier, mais je ne savais pas que le SGBD sous-jacent serait si difficile. Oracle n'aime pas la requête.
Eok
Oracle devient un peu délicat avec [DATABASE] .. [TABLENAME] cela nécessite ces points doubles. Si la requête ne fonctionne pas en tant que définition, vous pouvez toujours créer une vue (clic droit dans votre base de données> sélectionnez Nouveau> sélectionnez Vue>) dans votre SDE (en supposant que vous avez une configuration si vous tirez d'Oracle), puis écrivez une requête similaire.
MDHald
3

Je suis tombé sur ce Q&A qui m'a aidé à résoudre pourquoi je ne pouvais pas utiliser une clause where sur un curseur de recherche ArcPy qui pouvait restreindre le curseur aux enregistrements qui contenaient un trait de soulignement ( _) dans un champ de texte particulier.

Au moment où je l'ai trouvé, j'avais déjà développé un extrait de code pour illustrer le problème.Au lieu de gaspiller cet effort, j'ai ajouté la solution et je la poste maintenant ici pour peut-être aider un futur visiteur avec le même problème.

Le test utilise une géodatabase fichier et a été exécuté sur 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 :-)")

La sortie est:

>>> 
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 :-)
>>> 
PolyGeo
la source
1
Merci pour cela ... perdre tellement de temps sur les solutions de contournement et la syntaxe des caractères "spéciaux" .... j'espère que je me souviens où le trouver la prochaine fois qu'il apparaît.
Mike