2008-10-27 6 views
5

J'ai la requête SQL suivante:Pourquoi cette instruction SQL ne fonctionnera-t-elle pas?

SELECT DISTINCT name FROM log WHERE NOT name = '' AND name LIKE '%.EDIT%'; 

Il fonctionne très bien sur Postgres (retourne tous les différents noms de journal, qui ne sont pas vides et contiennent la chaîne « .EDIT »). Mais sur Oracle cette déclaration ne fonctionne pas. Une idée pourquoi?

Répondre

16
SELECT DISTINCT name FROM log WHERE NOT name = '' AND name LIKE '%.EDIT%'; 

1) Oracle traite '' comme NULL, ce qui signifie que la comparaison "NOT name = ''" est jamais vrai ou faux; utilisez "IS NOT NULL" à la place. Mais ...

2) La deuxième condition « nom LIKE '% .EDIT%' ne correspond pas à une chaîne vide de toute façon, ce qui rend la première condition redondante

donc ré-écrire comme:.

SELECT DISTINCT name FROM log WHERE name LIKE '%.EDIT%'; 
+0

Merci pour cette aide, ça marche très bien, je suis tellement idiot au sujet des choses redondantes, mais je ne savais pas non plus qu'Oracle comptait comme '' NULL '' Merci, maintenant ça marche. – Mnementh

3

La chaîne vide dans Oracle est équivalente à NULL, entraînant l'échec de la comparaison. Modifiez cette partie de la requête à NAME IS NOT NULL

2

Vous pouvez réécrire cette requête sans la clause "NOT NAME = ''".

SELECT DISTINCT name 
FROM log 
WHERE name LIKE '%.EDIT%'; 

Est-ce que cela fonctionne pour vous?

Sinon, de quelle manière cela ne fonctionne-t-il pas? Cela provoque-t-il une erreur? Les mauvais résultats sont-ils renvoyés?

S'il vous plaît élargir votre question avec cette info :-)

Questions connexes