如何调整下面的查询,使其不会执行不必要的 UNION ALL
除非上面的 SELECT
语句找不到匹配项?
SELECT LATITUDE, LONGITUDE FROM coordinates WHERE address = ? AND community = ?
UNION ALL
SELECT LATITUDE, LONGITUDE FROM coordinates WHERE address::text = ? AND community::text LIKE ?
UNION ALL
SELECT LATITUDE, LONGITUDE FROM coordinates WHERE address::text LIKE ? AND community::text LIKE ?
我的坐标
表有列|身份证 |地址 |城市 |纬度 |经度
我尝试以最有效的方式从纬度和经度中提取值,同时首先执行最强的查询,这意味着那些 SELECT
语句将返回最可靠的结果。如果找到结果,则返回该结果并丢弃剩余的查询。
现在,我将所有查询都放在 ArrayList
中,然后单独循环并执行。如果找到 match()
,则返回 结果集
。列表顶部的查询是更严格的查询,使用 =
而不是 LIKE
,如果找不到结果,则逐渐变得不那么严格。
这显然效率很低,因为我要分别执行近 100 个 SELECT
查询,因此我研究了使用 UNION ALL
,我的计划是在每个 SELECT
语句之间使用 UNION ALL
创建一个巨大的查询。但是,我现在很困惑,如果找到匹配项,如何中止任何后续查询?
当前方法:
queryList.add("SELECT LATITUDE, LONGITUDE FROM coordinates WHERE address = ? AND community = ?");
queryList.add("SELECT LATITUDE, LONGITUDE FROM coordinates WHERE address::text = ? AND community::text LIKE ?");
queryList.add("SELECT LATITUDE, LONGITUDE FROM coordinates WHERE address::text LIKE ? AND community::text LIKE ?")
PreparedStatement pStatement = null;
ResultSet rs = null;
Connection conn = null;
for (String currentQuery: queryList) {
Connection conn = getConnection();
pStatement = conn.prepareStatement(currentQuery);
pStatement.setString(1, "742 Evergreen Terrace");
pStatement.setString(2, "Springfield");
// execute query
// if match, break loop and use resultset
}
因此,对于 UNION ALL
,如果第一个 SELECT
找到匹配项,我该如何中止?
编辑:
我正在尝试此查询,但它返回所有纬度和经度,而不仅仅是导致找到匹配项的纬度和经度。如何更改它以仅返回相关行?
SELECT LATITUDE, LONGITUDE FROM coordinates
WHERE EXISTS(SELECT LATITUDE, LONGITUDE FROM coordinates WHERE
(address = ? AND community = ?) OR WHERE (address::text = ? AND community::text LIKE ?))
最佳答案
您必须对数据进行虚拟处理。让第一个选择一些虚拟记录,这样它就不会失败。或者在开始之前确定什么不会失败。然后,您可以使用嵌套选择来删除虚拟行。基本语法示例。
select Latitude, longitude from
(
select 'dummy data' as Lattitude, 'AltDummy' as Longitude
union all
SELECT LATITUDE, LONGITUDE FROM coordinates WHERE address = ? AND community = ?
UNION ALL
SELECT LATITUDE, LONGITUDE FROM coordinates WHERE address::text = ? AND community::text LIKE ?
UNION ALL
SELECT LATITUDE, LONGITUDE FROM coordinates WHERE address::text LIKE ? AND community
) x
where Lattitude <> 'dummy data' and Longitude <> 'AltDummy'
您还需要将虚拟数据转换为与实际数据完全相同的数据类型,才能 100% 正常工作。将其作为一个查询全部提交给 sql server,并让 sql server 完成工作。
关于java - 如果找到匹配,则中止后续的 UNION ALL 命令 [H2],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45023444/