2017-07-13 2 views
0

J'ai une requête:Suppression NULL d'une liste de valeurs

<cfif topic NEQ ""> 
    <cfquery name="queryTopicName" datasource="#ODBC#"> 
     select topic as topicName from ltbTopics where topicId in (#topic#) 
    </cfquery> 
    <cfset selectedRiskCategories = ValueList(queryTopicName.topicName)> 
</cfif> 

Ici, le « # # sujet » contient une liste dont la première valeur est vide, il aime VIENT ,, 51,52, etc il donne une erreur:

« syntaxe incorrecte près ''


L'erreur sur la ligne 33" ., peut-on me aider dans ce cas, comment résoudre cela?

+0

Vous parlez d'un nul. Cette liste provient-elle d'une autre requête? Si c'est le cas et si vous n'utilisez que cette requête pour extraire des valeurs pour celui-ci, vous pouvez simplement l'inclure dans l'autre sujet sélectionné comme topicName de ltbTopics où topicId dans (sélectionnez un sujet dans some_other_table où something = something_else) –

Répondre

1

Il existe plusieurs façons de faire cela. Mais un simple hack est de convertir la liste en un tableau puis de revenir à la liste.

<cfif topic NEQ ""> 
<cfset arrayTopic = ListToArray(topic)> 
<cfset topic = ArrayToList(arrayTopic)> 
<!---you may need some more validations as it is possible that original list only has commas in it---> 
    <cfquery name="queryTopicName" datasource="#ODBC#"> 
     select topic as topicName from ltbTopics where topicId in (#topic#) 
    </cfquery> 
    <cfset selectedRiskCategories = ValueList(queryTopicName.topicName)> 
</cfif> 
+0

Salut merci pour poster la suggestion, pouvez-vous s'il vous plaît expliquer comment l'implémenter dans le code ci-dessus? –

+0

Merci beaucoup pour votre réponse cela a fonctionné. –

+0

Utilisez 'cfqueryparam' dans vos requêtes pour la prévention de l'injection sql et pour éviter la régénération du plan d'exécution. – Beginner

1

Merci pour vos réponses à la requête finale qui a travaillé pour moi parfaitement est:

<!--- Query to extract selected risk category filters ---> 
    <cfif topic NEQ ""> 
     <cfset arrayTopic = ListToArray(topic)> 
     <cfset topic = ArrayToList(arrayTopic)> 

     <cfquery name="queryTopicName" datasource="#ODBC#"> 
    select 
     topic as topicName 
    from 
     ltbTopics 
    where 
     topicId in 
     (
      <cfqueryparam 
      value = "#topic#" 
      cfsqltype= "CF_SQL_INTEGER" 
      list = "true" 
     />) 
     </cfquery> 
     <cfset selectedRiskCategories = ValueList(queryTopicName.topicName)> 
    </cfif> 

    Once again thanks for your help, I really appreciate it. 
+0

Je recommande de boucler et de tester des entiers ou d'utiliser le UDF justNumericList (préféré) http://cflib.org/udf/justNumericList Ceci est particulièrement important si la valeur "topic" est un paramètre FORM ou un paramètre URL. Méfiez-vous des valeurs numériques non entières (notation scientifique, long, décimal, nombre suivi d'un espace, etc.).'' –