我如何用字符串中的select语句评估cfif

时间:2014-12-03 11:37:57

标签: sql database coldfusion coldfusion-9 cfml

sel_prod_dt = "select distinct change_app_code, change_number "
          & " \<cfif NDA_check eq "
          &'"Y"' 
          &"> FROM db.tb tb"
          &"\<cfelse\>FROM db.tb2 PC\<\/cfif\>"

我收到以下错误

语法错误,在单词&#39; change_number&#39;之间需要类似名称或Unicode分隔符的标识符。和请求的结束。

在这方面,有谁可以帮助我..

4 个答案:

答案 0 :(得分:6)

无法将CFML添加到字符串中,并且它们会以某种方式期望它运行!字符串直到运行时才被处理,CFML代码需要在它运行之前进行编译。

阅读此内容应该澄清&#34; The ColdFusion request/response process&#34;

因此,在运行之前,您需要在文件中使用完整且语法正确的CFML。

您的问题中没有提供足够的详细信息,无法为您的问题提供实际的代码解决方案,但基本上@Ocssor可能已经做对了。

答案 1 :(得分:2)

为什么过于复杂?

<cfif NDA_check eq "Y">
    sel_prod_dt = "select distinct change_app_code, change_number FROM db.tb tb"
<cfelse>
    sel_prod_dt = "select distinct change_app_code, change_number FROM db.tb2 PC"
</cfif>

答案 2 :(得分:2)

动态地(在字符串中)组装一个sql查询通常是危险的并且很少需要(当它是时,是时候重新考虑事情了,如果你仍然认为它是再次考虑)。它还牺牲了使用极为重要的标签cfqueryparam的能力。

所以,你会做这样的事情

<cfquery...>
  select distinct change_app_code, change_number
    <cfif NDA_check eq '"Y"'>FROM db.tb tb
    <cfelse>FROM db.tb2 PC</cfif>
</cfquery>

现在是使用Ternary Ifs的好时机,它们看起来更清洁了

(NDA检查的值确实应该是"Y"我无法分辨,更可能的是,它应该是Y。您可能需要更改它。)

<cfquery...>
  select distinct change_app_code, change_number
    FROM #(NDA_check eq '"Y"' ? "db.tb tb" : "db.tb2 PC")#
</cfquery>

三元IF可以像你想要的那样用在字符串中:

<cfset myfavcolor = "green">
<cfset yourfavcolor "red">
<cfset DoWeAgree = "We have #(myfavcolor is yourfavcolor ? "the same favorite color" : "different favorite colors")#">

但是,它们的运行方式非常简单。唯一的办法就是如果要嵌套另一个三元组,那么它们对于其他的非常不理想,特别是很多其他的。

<cfset myfavcolor = "green">
<cfset yourfavcolor "red">
<cfset DoWeAgree = "We have #(myfavcolor is yourfavcolor ? "the same favorite color" : (yourfavcolor is not "purple" ? "different favorite colors" : "... I'm not talking to you, you like purple"))#">

为了记录,我似乎很奇怪你没有利用表别名。使用我上面的cfquery样本。

<cfquery...>
  select distinct change_app_code, change_number
    FROM #(NDA_check eq '"Y"' ? "db.tb" : "db.tb2")# theTB
</cfquery>

这样,无论从哪个表中提取,您都可以将表(在查询中)引用为TB。


现在,提出一些建议。

如果您觉得需要将表名加载到变量名

select * from #thetable#

确保范围该变量。如果是您在页面中设置的内容,请将其设置为

<cfset variables.thetable = "mytable">

select * from #variables.thetable#

但是,作为一项规则,如果我不能<cfqueryparam>且表名不能<cfqueryparam>',我就不会将变量放入查询中。

如果我绝对必须,我会对该变量进行调整,正如我演示的那样,以便我知道源,因为......

select * from #thetable#

可能会意外地获得url.thetable或form.thetable的来源,这是一个灾难性的并且对SQL注入开放。


更多建议,因为你刚刚开始使用CF,你应该在查询的where子句中的每个#variable#中开始一个好的(而且非常重要的)习惯<cfqueryparam>。它还应该用于插入或更新查询中的每个用户可配置变量。这样做总是很重要。 (很遗憾,你不能cfqueryparam一个动态表名。)

在此处阅读cfqueryparam:cfqueryparam

标签可能看起来很长(事实上,我永远不会知道adobe在想什么),但它是你对SQL Injection的第一道防线。

答案 3 :(得分:0)

要在构建字符串时使用条件逻辑,请一步一步。

sqlString = "select field1, field2 ";
if (something) {
sqlString &= ", field3";
}
sqlString &= " rest of the query goes here";