java - 如果找到匹配,则中止后续的 UNION ALL 命令 [H2]

标签 java sql query-optimization h2 union-all

如何调整下面的查询,使其不会执行不必​​要的 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/

相关文章:

java - 如何使用多线程处理存储在本地磁盘中的大量文件(使用文件锁)

sql - 使用两列对查询结果进行排序

sql - 如何在列数据 Spark scala 上检查 isEmpty

mysql - 使用子查询是在不相关的表上使用 GROUP_CONCAT() 的最佳方法吗?

mysql - 相关产品方法建议,MySQL InnoDB/PHP

php - SELECT/UPDATE 和 SELECT/INSERT 杀死 MySQL 服务器

java - 评估 Tic-Tac-Toe 的获胜状态

java - sakai cle 中的 iframe 攻击(xss)

java - byte[] toString() 给出一个奇怪的字符串而不是实际值

php - 通过环境提供数据库凭据而不是硬编码