Список диапазонов, используемых в выражении SQL, создает ошибку "Недопустимый оператор SQL"

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

ExecuteError: ERROR 999999: Error executing function.
An invalid SQL statement was used.
An invalid SQL statement was used. [PatientVisitsGeocoded]
An invalid SQL statement was used. [SELECT ObjectID FROM PatientVisitsGeocoded WHERE USER_CenterID = 1001 AND USER_MonthsSinceFHOpening = (1, 3)]
Failed to execute (FeatureClassToFeatureClass)

Однако, когда я использую только один диапазон вместо списка диапазонов, скрипт работает нормально.

Мне было трудно найти примеры списков, содержащих диапазоны, и я разработал синтаксис для моего списка из лучшего ответа на этой странице:

Список Python с диапазонами

Я не знаю, является ли синтаксис для моего списка диапазонов неправильным или мне нужно изменить способ построения моего выражения. Любой совет / помощь будет высоко ценится.

Вот мой полный код:

# Set environment settings
arcpy.env.workspace = r"C:\arcGIS_Shared\Python\CenterHeatMaps6.gdb"

#Declare variables
fc = 'Open_GoHealth_Centers'
fields = ['USER_market_id','USER_GoHealth_ID','USER_GoHealth_Center_Name','USER_Opening_Date', 'USER_MonthsSinceFHOpening']
fieldname = 'USER_market_id'

# Set Markets to loop through
markets = [1000]
# Set Years to loop through
years = [2014, 2015]
# Set Ranges to loop through
myranges = [(1,3),(1,4),(1,5)]

sqlclause = (None, 'Order By USER_market_id, USER_GoHealth_ID')

for market in markets:
    print (market)
    #Define WHERE clause statement
    whereclause = """{} = """.format(arcpy.AddFieldDelimiters(fc, fieldname)) + str(market)

    for year in years:
        print (year)
        for myrange in myranges:
            print (myrange)
            with arcpy.da.SearchCursor(in_table = fc, field_names = fields, where_clause=whereclause, sql_clause=(None, 'ORDER BY USER_market_id, USER_GoHealth_ID')) as cursor:
                #Loop through each row established in cursor
                for row in (cursor):
                    # Set local variables for the FeatureClasstoFeatureClass tool
                    inFeatures = "PatientVisitsGeocoded"
                    outLocation = r"C:\arcGIS_Shared\Python\CenterHeatMaps6.gdb"
                    outFeatureClass = "PatientVisits{0}_{1}_{3}".format(row[0], row[2], myrange, year) 
                    delimitedfield = arcpy.AddFieldDelimiters(arcpy.env.workspace,"USER_CenterID")
                    expression = """{0} = {1} AND USER_MonthsSinceFHOpening = {2}""".format(delimitedfield, row[1], myrange) 
                    print (expression)

#                   Execute FeatureClassToFeatureClass tool
                    arcpy.FeatureClassToFeatureClass_conversion(inFeatures, outLocation, outFeatureClass, expression)

#                   #Print Results
                    print(row[2])
                    print(year)
                    print(myrange)

1 ответ

Решение

Так должно быть In (1, 3) не = (1, 3),

Если вы хотите диапазон между значениями 1 и 3, используйте Between 1 and 3, In означает "соответствовать одному из этих значений", оно не является включающим.

Другие вопросы по тегам