在ArcMap中查询下划线字符?


10

对于针对基于Oracle的ArcSDE要素类的标准LIKE查询,下划线字符与字符串一起使用时表示单个字符通配符。

我正在尝试使用定义查询来查找以4位数字开头,后跟下划线字符的文本字符串。

有谁知道我将如何在查询中指定下划线字符本身,或者转义字符可能/是什么?

MDHald的答案适用于文件地理数据库,但我的案例仅针对Oracle。错误地假设在这种情况下,ArcSDE和文件地理数据库查询的功能相同。


转义字符通常是一个反斜杠\ -我相信Oracle也是如此,因此如果要\_搜索下划线,则需要查找。
Midavalo

@Midavalo,这是我想到的第一件事。我的查询是CABLE ='_____ \ _%',返回零结果。
Eok 2016年

您可能需要使用LIKE(尽管您确实在问题中提到LIKE)- CABLE LIKE '____\_%'。尽管我使用的是SQL Server而不是Oracle,但我会在这里玩,所以可能会得到不同的结果
Midavalo


1
@Midavalo,您做完后发现了完全相同的东西
Eok 2016年

Answers:


7

设法追踪答案。

您可以在查询中指定一个ESCAPE字符,例如:

MY_FIELD赞'____ $ _%'逃逸'$'

这将搜索正好4个字符,后跟一个下划线字符,然后再搜索其他字符。

在此页面上找到了文档:http : //desktop.arcgis.com/cn/arcmap/10.3/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm

不确定此版本适用于多久以前或什么版本,但它适用于ArcGIS Desktop 10.3。

文档摘录:

x [NOT]喜欢y [ESCAPE'转义字符']

将LIKE运算符(而不是=运算符)与通配符一起使用以构建部分字符串搜索。百分号(%)表示任何地方都可以接受:一个字符,一百个字符或不包含任何字符。或者,如果要使用代表一个字符的通配符进行搜索,请使用下划线(_)。如果需要访问非字符数据,请使用CAST功能。例如,此查询从整数字段SCORE_INT返回以8开头的数字:

CAST(“ SCORE_INT” AS VARCHAR)喜欢'8%'

要在搜索字符串中包含百分号或下划线,请使用ESCAPE关键字将另一个字符指定为转义字符,这又表示紧随其后的是实际百分号或下划线。例如,此表达式返回包含10%的任何字符串,例如10%DISCOUNT或A10%:

“ AMOUNT”,如“%10 $ %%”,ESCAPE“ $”


3

您将需要使用CHAR_LENGTH和SUBSTRING才能使它起作用。它看起来如下:

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

其中yourfieldname =您的字段名称。

但是,请勿删除代码中的“”。按原样复制,仅替换文本yourfieldname。


您的答案适用于文件地理数据库,但我没有意识到基础DBMS会如此挑剔。Oracle不喜欢该查询。
Eok 2016年

Oracle使用[DATABASE]有点棘手。[TABLENAME]它需要这些双重要点。如果查询不能作为定义,则可以始终在SDE中创建一个视图(在数据库中单击鼠标右键>选择“新建”>“选择视图”)(假设您是从Oracle中提取的,则有一个设置),然后写出类似的查询。
MDHald,2016年

3

我遇到了这个问答,它帮助我解决了为什么无法在ArcPy搜索游标上使用where子句的问题,该子句可以将游标限制为仅包含_在特定文本字段中包含下划线()的那些记录。

到我找到它的时候,我已经开发了一个代码片段来说明问题,因此,我没有在浪费精力,而是在上面添加了解决方案,现在将其发布在这里,以帮助将来有相同问题的访客。

该测试使用文件地理数据库,并且在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 :-)")

输出为:

>>> 
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
谢谢。。。花了很多时间在“特殊”字符变通方法和语法上。
迈克(Mike)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.