2

我正在尝试通过访问表中的字段中的项目进行光标搜索。然后我将它们附加到一个名为“distList”的列表中。我想将列表传递到等式中的 SQL 查询构建器“WHERE”子句中:

"Field1" in distList

或长期来看,它看起来像这样:

"Field1" in ('ds(c1)', 'ds(b1)', 'ds(c2)', 'ds(g1)')

该列表如下所示:

['ds(c1)', 'ds(b1)', 'ds(c2)', 'ds(g1)']

我遇到的问题是,上面的 SQL 等式不喜欢“查看”python 列表。它不识别方括号。它更喜欢圆括号,所以我考虑使用元组。我面临的问题是我不知道如何在光标搜索访问表中的项目后构建一个元组。这是我的代码示例:

distList = []
for lyr in arcpy.mapping.ListLayers(mxd, "", df):
    if lyr.name == "Disturbance":
           for row in arcpy.SearchCursor(lyr):
                if "ds" in row.Field1:
                     distList.append(row.Field1)
    lyr.definitionQuery = '"Field1"' + "in " + distList

任何人都可以建议一种将我的列表放入元组的方法,或者只是一种更好的方法将我的项目转换为具有圆括号而不是方括号的格式?

作为一种解决方法,我尝试将列表转换为字符串str(distList),然后替换括号。这很好用,但看起来很麻烦,我相信有更好的方法。

谢谢,迈克

4

3 回答 3

1

预处理列表:

distList = ['ds(c1)', 'ds(b1)', 'ds(c2)', 'ds(g1)']
refinedList = ','.join(a for a in distList)

在 WHERE 子句中在 SQL 中传递细化列表,如下所示:

SQL_QUERY = """
select *
from abc
where someCol = ({0})

"""

SQL = SQL_QUERY.format(refinedList)

这里的 {0} 是参数 (refinedList)。查看 pythonDocs 以更好地理解 String format() 函数。执行查询,将运行。

于 2012-08-22T21:47:01.933 回答
1

你试过了吗:

str(tuple(distList))

编辑:

以上仅适用于具有多个项目的列表。

与 Arun 的答案类似的东西更笼统,因为它适用于一个或多个项目:

distlist = '({})'.format(','.join(elem for elem in distlist))

但是,根据查询和 RDBMS,事先检查单个项目并在这种情况下仅使用相等运算符可能会更有效。

于 2012-08-22T20:53:42.893 回答
0

我收到了另一个网站的答案,所以我想我会把它传递下去。以下脚本将查询更改为字符串并被我的定义查询接受。为了增加价值,我“设置”了列表以消除重复项:

if "ds" in row.Field1:
            distList.append('"{}"'.format(row.Field1))
    lyr.definitionQuery = '"Field1" in ({})'.format(", ".join(set(distList)))
于 2012-08-22T21:39:47.843 回答