Comment puis-je adapter la requête ci-dessous afin qu'il ne fonctionne pas inutile UNION ALL
à moins la déclaration ci-dessus SELECT
il ne trouve pas un match?Abandonner UNION ultérieure toutes les commandes si correspondance trouvée [H2]
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 ?
Mon tableau coordinates
a des colonnes | ID | ADRESSE | VILLE | LATITUDE | J'essaie d'extraire les valeurs de la latitude et de la longitude de la manière la plus efficace, tout en exécutant d'abord les requêtes les plus fortes, c'est-à-dire les instructions SELECT
qui retourneront le résultat le plus fiable. Si un résultat est trouvé, renvoyez-le et ignorez les requêtes restantes.
En ce moment j'ai toutes mes requêtes dans un ArrayList
que je boucle et exécute individuellement. Si un match()
est trouvé, je retourne le resultset
. Les requêtes en haut de la liste sont celles qui sont plus strictes, en utilisant =
au lieu de LIKE
, devenant progressivement moins strictes si aucun résultat n'est trouvé.
Ceci est évidemment inefficace puisque je joue près de 100 requêtes SELECT
séparément, donc je l'ai regardé en utilisant UNION ALL
et mon plan est de créer une requête géante avec UNION ALL
entre chaque déclaration SELECT
. Cependant, je suis maintenant confus comment annuler toutes les requêtes ultérieures si une correspondance est trouvée?
approche actuelle:
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
}
Donc, avec UNION ALL
, comment puis-je avorte si le premier SELECT
trouve un match?
EDIT:
J'essaie cette requête, mais elle renvoie tous latitutudes et longitudes au lieu de seulement ceux qui ont amené le match à trouver. Comment puis-je modifier cela pour ne renvoyer que la ligne correspondante?
SELECT LATITUDE, LONGITUDE FROM coordinates
WHERE EXISTS(SELECT LATITUDE, LONGITUDE FROM coordinates WHERE
(address = ? AND community = ?) OR WHERE (address::text = ? AND community::text LIKE ?))
Je ne vois pas comment cela répond à ma question de comment ** annuler les commandes 'UNION ALL' suivantes si une correspondance est trouvée **. Comment créer une ligne fictive (?) Dans ma table provoque l'abandon des commandes 'UNION ALL' suivantes si une correspondance est trouvée dessus? – IanSky
Désolé, je n'ai pas compris ce que vous cherchez.Je pensais que tu avais une erreur. Pour faire ce que vous cherchez, vous avez besoin d'une procédure stockée. Vous ne pouvez pas le faire juste en ligne droite. –
En fait, si vous faites la première sélection dans une table temporaire. Ensuite, vérifiez le nombre de la table temporaire et éventuellement quitter, vous pouvez le faire. Mais les tables temporaires peuvent être lentes avec de grands ensembles de données. –