PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → Importance de l'ordre dans une condition de requête SQL
Importance de l'ordre dans une condition de requête SQL
Débuté par Mathieu, 07 juil. 2025 16:57 - 2 réponses
Membre enregistré
2 messages
Posté le 07 juillet 2025 - 16:57
Bonjour,

Je suis actuellement en version 26 de Windev.

J'ai un problème lors de l'exécution d'une requête SQL, que ce soit en exécutable, en test, en WDMap ou en centre de contrôle HFSQL, voici ma requête :
SELECT DISTINCT A.Code FROM A INNER JOIN B ON A.Code=B.Code WHERE A.Type<>'1' ET A.Type<>'2' ET A.Type<>'5' ET A.Type<>'7' ET (A.DTM>'2025070715425151' OU (B.Date='20250707' ET B.Heure>='15445151'))
Cette requête me renvoi la réponse : 000123

Cependant si j'inverse l'ordre dans ma condition :
SELECT DISTINCT A.Code FROM A INNER JOIN B ON A.Code=B.Code WHERE A.Type<>'1' ET A.Type<>'2' ET A.Type<>'5' ET A.Type<>'7' ET ((B.Date='20250707' ET B.Heure>='15445151') OU A.DTM>'2025070715425151')
Cette requête me renvoi la réponse : 000123 - 000124

La réponse de la deuxième requête est la bonne, mais je ne comprend pas pourquoi l'ordre de la condition impacterai le résultat. J'ai fais un test avec la version 28 puis 2024 d'un collègue et les deux requêtes renvoient le bon résultat à chaque fois, peu importe l'ordre.

Je doute maintenant du résultat des requêtes SQL que j'aurai pu faire auparavant, si quelqu'un peut m'éclairer.
Merci.
Membre enregistré
1 message
Posté le 22 juillet 2025 - 14:00
Problème : l’ordre d’évaluation des conditions n’est pas respecté comme vous l’attendez, même si vous avez bien mis des parenthèses autour du (B.Date = ... AND B.Heure >= ...).
https://www.marykayintouches.com
Dans Windev 26 (et potentiellement dans certaines implémentations du moteur HFSQL), il semble que le moteur interprète à tort les conditions ET ... OU ... sans respecter strictement la priorité des parenthèses, surtout si le parseur SQL est un peu "naïf".

SELECT DISTINCT A.Code
FROM A
INNER JOIN B ON A.Code = B.Code
WHERE A.Type <> '1' AND A.Type <> '2' AND A.Type <> '5' AND A.Type <> '7'
AND ((B.Date = '20250707' AND B.Heure >= '15445151') OR A.DTM > '2025070715425151')
Ici, vous inversez l'ordre des conditions dans le OU, et cette fois le moteur retourne le bon jeu de résultats, car les parenthèses englobent clairement l’ensemble de la condition logique.

Explication technique
En SQL standard, les opérateurs AND ont une priorité plus forte que les OR. Cela signifie :

sql
Copy
Edit
A AND B OR C
...est interprété comme :

sql
Copy
Edit
(A AND B) OR C
Dans votre requête 1 :

sql
Copy
Edit
... AND A.DTM > '...' OR (B.Date = ... AND B.Heure >= ...)
→ Cela pourrait être interprété à tort comme :

sql
Copy
Edit
(... AND A.DTM > '...') OR (B.Date = ... AND B.Heure >= ...)
Même si vous aviez l’intention d’écrire :

sql
Copy
Edit
... AND (A.DTM > '...' OR (B.Date = ... AND B.Heure >= ...))
Mais dans Windev 26, l’ordre des conditions semble casser l’analyse logique malgré les parenthèses.
Membre enregistré
2 messages
Posté le 23 juillet 2025 - 09:31
Merci pour votre explication. :)