รวมถึงตัวแปรที่ส่วนของ arcpy.Select_analysis ()?


21

ฉันพยายามวนลูปผ่าน Shapefile โดยเลือกคุณสมบัติแต่ละอันแล้วคัดลอกไปยัง Shapefile ชั่วคราวเพื่อรวมไว้ในการวิเคราะห์แบบรวม ฉันใช้เคอร์เซอร์เพื่อค้นหาชื่อ ID สำหรับแต่ละคุณสมบัติที่ฉันตั้งค่าเป็น 'ชื่อ' ที่หลากหลาย เมื่อใดก็ตามที่ฉันพยายามใช้ตัวแปรนี้เป็นส่วนหนึ่งของส่วนคำสั่งใน arcpy.Select_analysis ฉันได้รับข้อผิดพลาด:

ExecuteError: ข้อผิดพลาด 999999: ข้อผิดพลาดในการใช้งานฟังก์ชั่น มีการใช้คำสั่ง SQL ที่ไม่ถูกต้อง มีการใช้คำสั่ง SQL ที่ไม่ถูกต้อง ไม่สามารถดำเนินการได้ (เลือก)

รหัสที่ฉันใช้คือ:

Name = 101
where = "\'\"StudyID\" = \\'"+str(Name)+"\\'\'"
arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", where)

ถ้าฉันพิมพ์โดยไม่ใช้ตัวแปร:

arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", '"StudyID" = \'101\'')

มันใช้งานได้ดี

ฉันต้องทำอะไรเพื่อให้พอดีกับตัวแปรในคำสั่ง sql

คำตอบ:


14

อีกวิธีที่ง่ายกว่าคือ:

where = '"StudyID" = ' + "'%s'" %Name

2
"เมื่อใช้ ArcGIS 10 (หรือสันนิษฐานภายหลัง) ไม่จำเป็นต้องอ้างชื่อฟิลด์" นี่ไม่ถูกต้อง ตัวคั่นฟิลด์จะต้องระบุตามกฎไวยากรณ์พื้นฐานของ DBMS ดูคำตอบของฉัน
blah238

ความคิดเห็นด้านบนเป็นการตอบสนองต่อการแก้ไขแบบไม่ระบุชื่อที่ฉันย้อนกลับเพื่อความถูกต้องของคำตอบนี้
blah238

นี่ไม่ใช่ช่องโหว่การฉีด SQL Nameหรือไม่ถ้ามาจากการป้อนข้อมูลของผู้ใช้
jpmc26

22

สิ่งหนึ่งที่ทำให้การเขียนคำสั่ง WHERE ง่ายขึ้นมากคือการใช้AddFieldDelimitersฟังก์ชั่นซึ่งจะเพิ่มตัวคั่น DBMS เฉพาะที่ถูกต้องสำหรับตัวระบุฟิลด์เช่นการเสนอราคาสองเท่าสำหรับ FGDB และวงเล็บสำหรับ PGDB

สิ่งอื่นที่คุณต้องพิจารณาคือค่าเป็นตัวเลขสตริงหรือชนิดข้อมูลอื่น สตริงจะถูกห่อด้วยเครื่องหมายคำพูดเดี่ยวในขณะที่ตัวเลขไม่ใช่ คุณสามารถตรวจสอบประเภทของเขตข้อมูลและเพิ่มคำพูดเดียวถ้ามันเป็นเขตข้อมูลสตริง

เช่น:

import arcpy

def buildWhereClause(table, field, value):
    """Constructs a SQL WHERE clause to select rows having the specified value
    within a given field and table."""

    # Add DBMS-specific field delimiters
    fieldDelimited = arcpy.AddFieldDelimiters(table, field)

    # Determine field type
    fieldType = arcpy.ListFields(table, field)[0].type

    # Add single-quotes for string field values
    if str(fieldType) == 'String':
        value = "'%s'" % value

    # Format WHERE clause
    whereClause = "%s = %s" % (fieldDelimited, value)
    return whereClause

if __name__ == "__main__":
    inputfc = r"C:\input.shp"
    outputfc = r"C:\output.shp"
    fieldname = "StudyID"
    fieldvalue = 101
    whereclause = buildWhereClause(inputfc, fieldname, fieldvalue)
    arcpy.Select_analysis(inputfc, outputfc, whereclause)

ดูฟังก์ชั่นในคำตอบนี้สำหรับรุ่นหลายค่าของฟังก์ชั่นด้านบน


2
ความคิดที่ดี. ฉันได้เพิ่มฟังก์ชั่นนี้ลงในโมดูลฟังก์ชั่นตัวช่วย arcpy ของฉันดังนั้นมันจึงถูกกำหนดให้เป็น arcpy.buildWhereClause
blord-castillo


0

ฉันชอบที่จะใช้คำพูดที่สาม ฉันคิดว่าพวกเขาอ่านง่ายที่สุด ตัวอย่างเช่น,

name = 101
where = """ "StudyID" = '%s' """ % name
arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", where)

ทั้งนี้ขึ้นอยู่กับtype(name)คุณหรืออาจจะไม่จำเป็นต้องไปรอบ ๆ' %sสำหรับตัวเลขคุณต้องการ'แต่ไม่ใช่สำหรับข้อความ


0

สำหรับฉันโซลูชันนี้ทำงานได้ดีที่สุดเพราะฉันสามารถแทนที่ทั้งสองตัวแปรเป็นฟิลด์ที่สนใจและเกณฑ์ค่า

field = "Sport"
value = "Basketball"
where = """"{}" = '{}'""".format(field,value)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.