我如何调整下面的查询,以便它不会执行不必要的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 ?))
答案 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
同样的净结果。速度差异取决于您正在使用的平台。但这可能比以前更快。