2014-07-16 4 views
1

Puis-je utiliser le cfqueryparam pour une valeur nulle pour obtenir des enregistrements d'une table?Comment utiliser le cfqueryparam pour une valeur nulle pour obtenir des enregistrements d'une table?

Mon exemple requête de sélection est

Select * from users where lastname is null 
edit de

Dan Bracuk commence ici

Voici une exemple de requête contre une base de données Oracle:

<cfquery name="x" datasource="pamot"> 
select * 
from clinic_fu 
where hsc_number = <cfqueryparam cfsqltype="cf_sql_varchar" value="fred" null="yes"> 
</cfquery> 

Voici le débogage de la page Web.

select * 
from clinic_fu 
where hsc_number = ? 

Query Parameter Value(s) - 
Parameter #1(cf_sql_varchar) = 

Comment l'interprétez-vous? Était-ce ceci:

where hsc_number is null 

ou cette

where hsc_number = '' 
+0

Vous pourriez être en mesure de, mais ce que vous avez est mieux. –

+3

Pas vraiment besoin d'utiliser cfqueryparam avec cette requête, sauf si vous passez une valeur qui peut être 'NULL'. Si c'est le cas, regardez la propriété 'null' de' cfqueryparam'. –

+2

Si la valeur null est une constante (pas une variable), il n'y a aucun avantage à utiliser cfqueryparam. – Leigh

Répondre

1

La façon dont l'instruction SQL de débogage serait interprété est where hsc_number = null qui sera faux pour tous les enregistrements.

Dans certains langages SQL (peut-être juste MySQL), vous pouvez créer des expressions null safe. L'instruction fonctionnerait car a est nul quand une valeur nulle est spécifiée ou comme une instruction égale lorsqu'une valeur est spécifiée. Personnellement, je ne travaille pas avec Oracle DB, mais d'après mes recherches rapides, la seule option pour une expression sécurisée nulle inclurait les appels de fonction qui pourraient affecter les performances.

Une instruction if pour passer à is null lorsque vous avez besoin d'enregistrements NULL devrait être le meilleur moyen d'y accéder. Je trouve l'attribut null utile pour les insertions et les instructions de mise à jour plus puis avec des instructions select.

<cfquery result=> 
    INSERT INTO users 
    (first_name, last_name) 
    VALUES 
    (<cfqueryparam cfsqltype="cf_sql_varchar" value="#form.firstName#" null="#form.firstName eq ""#" />, 
    <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.lastName#" null="#form.lastName eq ""#" />); 
</cfquery> 

Dans cette déclaration, lorsque les valeurs de nom sont des chaînes vides une valeur NULL sera transmise à la base de données au lieu de la valeur de forme. Ce n'est pas un exemple très réaliste, car j'écrirais personnellement la chaîne vide au lieu d'une valeur nulle, mais cela montre comment l'attribut null peut être utilisé.

+0

Léger problème d'interprétation. où hsc_number = null n'est pas valide sql. –

+0

@DanBracuk - Convenu d'utiliser la norme ansi 'is null', au lieu d'égales. Comme une remarque intéressante, le comportement dépend réellement de la DBMS. Certains, comme le serveur SQL, supportent réellement la syntaxe 'col = null' non-standard. (Bien qu'il s'en ira bientôt). Je l'ai trouvé à la dure ... – Leigh

Questions connexes