Je suis tombé sur une requête dans une application dont j'ai hérité qui ressemble à ceci :
Select *
From foo
where
1 <> 1
Lorsque je l'analyse, il ne devrait rien retourner ( 1 <> 1
devrait être évalué à faux, à droite). Cependant (du moins sur ma machine Oracle), il revient avec une liste complète de tout ce qui se trouve dans le fichier foo
. Lorsque j'essaie la même chose dans MSAccess/Jet et MSSQL, j'obtiens le comportement que j'attends. Pourquoi est-ce différent pour Oracle (et pourquoi le développeur original voudrait-il faire cela) ?
Note : J'ai vu une certaine superstition à propos des avantages et des inconvénients de l'utilisation de "where 1 = 1", qui provoque des balayages complets de la table ; mais je ne pense pas que c'était l'intention du développeur original.
Petite mise à jour :
Dans ce cas foo
est une vue. Lorsque j'essaie la même chose sur une table réelle, j'obtiens ce à quoi je m'attends (aucune ligne).
Mise à jour 2 :
J'ai suivi le code plus loin dans le terrier du lapin et j'ai déterminé que tout ce qu'il fait est d'essayer de saisir les noms des champs/colonnes. Je ne comprends toujours pas pourquoi il renvoie l'ensemble complet d'enregistrements, mais uniquement sur les vues.
Littéralement, il construit la requête dans une chaîne et la transmet à une autre fonction pour qu'elle l'exécute sans la modifier.
'VB6
strSQL = "SELECT * FROM " & strTableName & " WHERE 1 <> 1"
Dans ce cas, strTableName contient le nom d'une vue.
Mise à jour 3 :
Pour référence, voici l'une des vues avec lesquelles j'ai des problèmes (J'ai changé les noms des champs/tables/schémas)
CREATE OR REPLACE FORCE VIEW scott.foo (field1,
field2,
field4,
field5,
field12,
field8,
field6,
field7,
field16,
field11,
field13,
field14,
field15,
field17
)
AS
SELECT bar.field1,
bar.field2,
DECODE
(yadda.field9, NULL, 'N',
DECODE (yadda.field3, NULL, 'Y', 'N')
) AS field4,
bar.field5,
snafu.field6,
DECODE
(snafu.field6,
NULL,
bar.field8,
bar.field8
- snafu.field6
) AS field7,
DECODE
(yadda.field10,
NULL,
bar.field12,
yadda.field10
) AS field11,
DECODE
(SIGN ( yadda.field10 - bar.field12),
NULL, 'N', 1, 'N', 0, 'N', -1, 'Y'
) AS field13,
bar.field14,
ADD_MONTHS
(DECODE (yadda.field10, NULL, bar.field12, yadda.field10
),
bar.field14 * 12
) AS field15,
FROM clbuttic,
bar,
yadda,
snafu
WHERE clbuttic.asset_type = bar.asset_type
AND bar.field16 = yadda.field9(+)
AND bar.field1 = snafu.field1(+)
AND (bar.field17 IS NULL)
;
Ajout de Order By 1
(ou un nom de colonne dans le select on foo) semble convaincre Oracle de me rendre l'ensemble vide. C'est une solution à long terme, mais pas à court terme (changer le code et le redéployer est un grand PITA). J'espère qu'il y a un paramètre peu connu du côté de la base de données ou quelque chose de mal dans la vue qui est la cause de ce comportement étrange.