【发布时间】:2020-10-18 16:16:13
【问题描述】:
我遇到了 Sqlite 3 的一个奇怪问题。我有一个相对简单的查询,它在其 WHERE 谓词中采用绑定参数。使用绑定参数执行查询时,我得到 0 个结果,但使用硬编码的值运行完全相同的查询,我得到预期的结果数 (> 0)。
通过调用sqlite3_expanded_sql() 并检查生成的 SQL 字符串,我再次检查了我的查询是否已按预期准备。
我的带有绑定参数的查询:
SELECT
b.name,
Y(Transform(b.geom, 4326)) "y",
X(Transform(b.geom, 4326)) "x"
FROM buildings b
WHERE Within(b.geom, Transform(PolygonFromText(?, 4326), 27700)) > 0
我为绑定参数提供的值:
let rectWkt = """
POLYGON((
-0.1381030196154711 51.51132617405723,
-0.12929698038450965 51.51132617405723,
-0.12929698038450965 51.50863378616471,
-0.1381030196154711 51.50863378616471,
-0.1381030196154711 51.51132617405723
))
"""
并且带有硬编码值的查询有效:
SELECT
b.name,
Y(Transform(b.geom, 4326)) "y",
X(Transform(b.geom, 4326)) "x"
FROM buildings b
WHERE Within(b.geom, Transform(PolygonFromText('POLYGON((
-0.1381030196154711 51.51132617405723,
-0.12929698038450965 51.51132617405723,
-0.12929698038450965 51.50863378616471,
-0.1381030196154711 51.50863378616471,
-0.1381030196154711 51.51132617405723
))', 4326), 27700)) > 0
最后,这是sqlite3_expanded_sql() 的输出,我在绑定上述值后调用它:
SELECT
b.name,
Y(Transform(b.geom, 4326)) "y",
X(Transform(b.geom, 4326)) "x"
FROM buildings b
WHERE Within(b.geom, Transform(PolygonFromText('POLYGON((
-0.1381030196154711 51.51132617405723,
-0.12929698038450965 51.51132617405723,
-0.12929698038450965 51.50863378616471,
-0.1381030196154711 51.50863378616471,
-0.1381030196154711 51.51132617405723
))', 4326), 27700)) > 0
除非我遗漏了什么,否则这些语句是相同的,但执行它们时会得到完全不同的结果。
我正在使用 Swift 绑定使用 sqlite c API 执行查询,并且我已经加载了 Spatialite 扩展(用于几何函数)。
我检查以我的值对sqlite3_bind_text() 的调用是SQLITE_OK。当我尝试遍历结果行时没有错误,我只是得到SQLITE_DONE 作为第一个结果,即。结果集为空。
【问题讨论】:
标签: sql sqlite spatialite