Truy vấn cho ký tự gạch dưới trong ArcMap?


10

Đối với truy vấn THÍCH tiêu chuẩn đối với lớp tính năng ArcSDE dựa trên Oracle, ký tự gạch dưới đại diện cho một ký tự đại diện duy nhất khi được sử dụng với một chuỗi.

Tôi đang cố gắng áp đặt một truy vấn định nghĩa để tìm một chuỗi văn bản bắt đầu bằng 4 chữ số chính xác theo sau là một ký tự gạch dưới.

Có ai biết làm thế nào tôi sẽ chỉ định một ký tự gạch dưới trong một truy vấn hoặc nếu / ký tự thoát có thể là gì không?

Câu trả lời của MDHald hoạt động cho cơ sở dữ liệu địa lý tệp nhưng trường hợp của tôi là dành riêng cho Oracle. Giả định sai rằng ArcSDE và tệp truy vấn geodatabase sẽ hoạt động giống nhau trong trường hợp này.


Ký tự thoát thường là dấu gạch chéo ngược \ - Tôi tin rằng đây cũng là trường hợp của Oracle, vì vậy bạn muốn \_tìm kiếm nếu tìm kiếm dấu gạch dưới.
Midavalo

@Unavalo, đó là điều đầu tiên tôi nghĩ đến. Truy vấn của tôi là CABLE = '_____ \ _%', trả về kết quả bằng không.
Eok

bạn có thể cần phải sử dụng LIKE(mặc dù bạn có đề cập đến THÍCH trong câu hỏi của bạn) - CABLE LIKE '____\_%'. Tôi sẽ chơi ở đây mặc dù tôi đang sử dụng SQL Server chứ không phải Oracle nên có thể nhận được các kết quả khác nhau
Midavalo


1
@Unavalo, đã tìm thấy điều tương tự chính xác ngay sau khi bạn làm
Eok

Câu trả lời:


7

Quản lý để theo dõi câu trả lời.

Bạn có thể chỉ định một ký tự ESCAPE trong truy vấn, chẳng hạn như:

MY_FIELD THÍCH '____ $ _%' ESCAPE '$'

Điều này sẽ tìm kiếm chính xác 4 ký tự theo sau là một ký tự gạch dưới cộng với bất cứ thứ gì khác sau đó.

Tìm thấy tài liệu trên trang này: http://desktop.arcgis.com/en/arcmap/10.3/map/usiness-with-layers/sql-reference-for-query-expressions- used-in -arcgis.htm

Không chắc khoảng thời gian quay lại hoặc phiên bản này hợp lệ là bao nhiêu nhưng nó hoạt động cho ArcGIS Desktop 10.3.

Trích từ tài liệu:

x [KHÔNG] THÍCH y [ESCAPE 'ký tự thoát']

Sử dụng toán tử THÍCH (thay vì toán tử =) với các ký tự đại diện để xây dựng tìm kiếm chuỗi một phần. Ký hiệu phần trăm (%) có nghĩa là mọi thứ đều được chấp nhận ở vị trí của nó: một ký tự, một trăm ký tự hoặc không có ký tự. Ngoài ra, nếu bạn muốn tìm kiếm bằng ký tự đại diện cho một ký tự, hãy sử dụng dấu gạch dưới (_). Nếu bạn cần truy cập dữ liệu không phải là vi khuẩn, hãy sử dụng chức năng CAST. Ví dụ: truy vấn này trả về các số bắt đầu bằng 8 từ trường số nguyên SCORE_INT:

CAST ("SCORE_INT" NHƯ VARCHAR) THÍCH '8%'

Để bao gồm ký hiệu phần trăm hoặc dấu gạch dưới trong chuỗi tìm kiếm của bạn, hãy sử dụng từ khóa ESCAPE để chỉ định một ký tự khác là ký tự thoát, từ đó chỉ ra rằng dấu phần trăm thực hoặc dấu gạch dưới ngay lập tức theo sau. Ví dụ: biểu thức này trả về bất kỳ chuỗi nào chứa 10%, chẳng hạn như GIẢM GIÁ 10% hoặc A10%:

"SỐ TIỀN" THÍCH '% 10 $ %%' ESCAPE '$'


3

Bạn sẽ cần sử dụng CHAR_LENGTH và SUBSTRING để làm việc này. Nó sẽ trông như sau:

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

nơi yourfieldname = tên của lĩnh vực của bạn.

Đừng xóa "" trong mã mặc dù. Sao chép nguyên trạng và chỉ thay thế văn bản yourfieldname.


Câu trả lời của bạn hoạt động cho cơ sở dữ liệu địa lý tệp, nhưng tôi không nhận ra rằng DBMS cơ bản sẽ rất kén chọn. Oracle không thích truy vấn.
Eok

Oracle gặp một chút khó khăn với [DATABASE] .. [TABLENAME] nó yêu cầu những điểm nhân đôi đó. Nếu truy vấn không hoạt động như một định nghĩa, bạn luôn có thể tạo chế độ xem (nhấp chuột phải vào cơ sở dữ liệu của bạn> chọn Mới> chọn Xem>) trong SDE của bạn (Giả sử bạn có một thiết lập nếu bạn đang kéo từ Oracle) và sau đó viết ra một truy vấn tương tự.
MDHald

3

Tôi đã xem qua Hỏi & Đáp này để giúp tôi giải quyết lý do tại sao tôi không thể sử dụng mệnh đề where trên con trỏ tìm kiếm ArcPy có thể giới hạn con trỏ chỉ những bản ghi có dấu gạch dưới ( _) trong trường văn bản cụ thể.

Vào thời điểm tôi tìm thấy nó, tôi đã phát triển một đoạn mã để minh họa vấn đề, vì vậy, thay vì lãng phí nỗ lực đó, tôi đã thêm giải pháp cho nó và hiện đang đăng nó ở đây để có thể giúp một khách truy cập tương lai gặp vấn đề tương tự.

Thử nghiệm sử dụng cơ sở dữ liệu địa lý tệp và được chạy tại ArcGIS 10.2.2 cho Máy tính để bàn.

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 :-)")

Đầu ra là:

>>> 
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
Cảm ơn vì điều đó ... lãng phí quá nhiều thời gian cho cách giải quyết và cú pháp của nhân vật "đặc biệt" .... hy vọng tôi nhớ nơi tìm thấy nó lần tới khi nó xuất hiện.
Mike
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.