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

时间:2017-07-11 00:13:08

标签: 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 ?

我的coordinates表有列| ID |地址| CITY | LATITUDE | LONGITUDE

我正在尝试以最有效的方式从纬度和经度中提取值,同时还首先执行最强的查询,这意味着那些将返回最可靠结果的SELECT语句。如果找到结果,请将其返回并丢弃剩余的查询。

现在我将所有查询都放在ArrayList中,然后我循环并单独执行。如果找到match(),则返回resultset。列表顶部的查询是更严格的查询,使用=代替LIKE,如果找不到结果,则逐渐减少严格。

这显然效率很低,因为我分别执行了近100个SELECT个查询,因此我开始使用UNION ALL,我的计划是使用UNION ALL创建一个巨型查询每个SELECT语句之间。但是,如果发现匹配,我现在很困惑如何中止任何后续查询

目前的做法:

            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找到匹配项,我该如何中止?

修改

我正在尝试此查询,但它会返回所有latitutudes和经度,而不仅仅是导致匹配被找到的那些。如何更改此选项才能返回相关行?

SELECT LATITUDE, LONGITUDE FROM coordinates
WHERE EXISTS(SELECT LATITUDE, LONGITUDE FROM coordinates WHERE 
(address = ? AND community = ?) OR WHERE (address::text = ? AND community::text LIKE ?))

2 个答案:

答案 0 :(得分:0)

你必须伪造数据。首先选择一些虚拟记录,以便它永远不会失败。或者在开始之前确定什么不会失败。然后,您可以使用嵌套选择来删除虚拟行。基本语法示例。

#!/bin/sh

# get rid of the curso so we don't see it when videos are running
setterm -cursor off

# set here the path to the directory containing your videos
VIDEOPATH="/home/pi/Videos"

# you can normally leave this alone
SERVICE="omxplayer"

# now for our infinite loop!
while true; do
    if ps ax | grep -v grep | grep $SERVICE > /dev/null
    then
    sleep 1;
else
    for entry in $VIDEOPATH/*
    do
        clear
        omxplayer $entry > /dev/null
    done
fi
done

您还需要使用与实际数据完全相同的数据类型投射虚拟数据,以便在100%的时间内正常工作。将它作为一个查询提交给sql server,让sql server完成工作。

答案 1 :(得分:0)

其他方法:

$ paste -d ' ' <(cut -c -10 file | sed 's/[ ][ ]*/,/g') <(cut -c 12- file)
A,B,10,C,d e f g
H,I,88,J,k l m n
O,P,3,Q,r s t u

同样的净结果。速度差异取决于您正在使用的平台。但这可能比以前更快。