Запрашивает символ подчеркивания в ArcMap?

10

Для стандартного запроса LIKE к классу объектов ArcSDE на основе Oracle символ подчеркивания представляет собой подстановочный знак из одного символа при использовании со строкой.

Я пытаюсь навязать запрос определения, чтобы найти текстовую строку, которая начинается с 4 цифр, за которыми следует символ подчеркивания.

Кто-нибудь знает, как я мог бы указать сам символ подчеркивания в запросе или если / каким может быть escape-символ?

Ответ MDHald работает для файловых баз геоданных, но мой случай специфичен для Oracle. Ложно предполагалось, что запрос ArcSDE и файловой базы геоданных будет работать одинаково для этого случая.

ЕОК
источник
Экранирующий символ обычно является обратной косой чертой \ - я полагаю, что это также относится и к Oracle, поэтому вы должны искать, \_если ищите подчеркивание.
Мидавало
@Midavalo, это было первое, что пришло в голову. Мой запрос был CABLE = '_____ \ _%', который дал ноль результатов.
Eok
Возможно, вам придется использовать LIKE(хотя вы упоминаете, как как в своем вопросе) - CABLE LIKE '____\_%'. Я
попробую
1
@Midavalo, нашел то же самое сразу после тебя
Eok

Ответы:

7

Удалось отследить ответ.

Вы можете указать ESCAPE символ в запросе, например:

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

Это будет искать ровно 4 символа, за которыми следует символ подчеркивания плюс что-нибудь еще после этого.

Нашел документацию на этой странице: http://desktop.arcgis.com/en/arcmap/10.3/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm

Не знаю, как далеко назад или для каких версий это действительно, но это работает для ArcGIS Desktop 10.3.

Выдержка из документации:

x [NOT] LIKE y [ESCAPE 'escape-персонаж']

Используйте оператор LIKE (вместо оператора =) с подстановочными знаками для построения частичного поиска строки. Символ процента (%) означает, что на его месте допустимо все: один символ, сто символов или нет символа. В качестве альтернативы, если вы хотите искать с подстановочным знаком, который представляет один символ, используйте подчеркивание (_). Если вам нужен доступ к данным, не связанным с символами, используйте функцию CAST. Например, этот запрос возвращает числа, начинающиеся с 8, из целочисленного поля SCORE_INT:

CAST ("SCORE_INT" AS VARCHAR) КАК "8%"

Чтобы включить символ процента или подчеркивание в строку поиска, используйте ключевое слово ESCAPE, чтобы назначить другой символ в качестве escape-символа, что, в свою очередь, означает, что сразу следует реальный знак процента или подчеркивание. Например, это выражение возвращает любую строку, содержащую 10%, например 10% DISCOUNT или A10%:

"AMOUNT" НРАВИТСЯ '% 10 $ %%' ESCAPE '$'

ЕОК
источник
3

Вам нужно будет использовать CHAR_LENGTH и SUBSTRING, чтобы это работало. Это будет выглядеть следующим образом:

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

где yourfieldname = название вашего поля.

Не удаляйте "" в коде, хотя. Скопируйте как есть и замените только текст yourfieldname.

MDHald
источник
Ваш ответ работает для файловых баз геоданных, но я не осознавал, что базовая СУБД будет настолько требовательной. Oracle не любит этот запрос.
Eok
Oracle становится немного хитрее с [DATABASE] .. [TABLENAME] ему требуются эти двойные очки. Если запрос не работает как определение, вы всегда можете создать представление (щелкните правой кнопкой мыши в своей базе данных> выберите Создать> выберите Представление>) в своем SDE (Предполагая, что у вас есть одна настройка, если вы используете Oracle), а затем выпишите аналогичный запрос.
MDHald
3

Я наткнулся на эти вопросы и ответы, которые помогли мне решить, почему я не смог использовать предложение where в поисковом курсоре ArcPy, которое могло ограничить курсор только теми записями, которые содержали подчеркивание ( _) в определенном текстовом поле.

К тому времени, когда я нашел его, я уже разработал фрагмент кода, чтобы проиллюстрировать проблему, поэтому вместо того, чтобы тратить эти усилия, я добавил к нему решение и сейчас публикую его здесь, чтобы, возможно, помочь будущему посетителю с той же проблемой.

Тест использует файловую базу геоданных и был запущен в ArcGIS 10.2.2 для рабочего стола.

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 :-)
>>> 
PolyGeo
источник
1
Спасибо за это ... тратить так много времени на "специальные" обходные пути и синтаксис символов ... надеюсь, я помню, где его найти, когда он появится в следующий раз.
Майк