动态组装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>
现在,这里的使用三元Ifs的一个伟大的时刻,他们看起来更清洁了很多
(是NDA支票的价值确实应该是"Y"
我不能告诉,更可能的是,它应该是Y
。您可能需要更改。)
<cfquery...>
select distinct change_app_code, change_number
FROM #(NDA_check eq '"Y"' ? "db.tb tb" : "db.tb2 PC")#
</cfquery>
三元国际单项体育联合会在字符串里使用ke您正在尝试:
<cfset myfavcolor = "green">
<cfset yourfavcolor "red">
<cfset DoWeAgree = "We have #(myfavcolor is yourfavcolor ? "the same favorite color" : "different favorite colors")#">
但是,它们在非常简单的If/else性质上运行。唯一的办法是如果嵌套另一个Ternary,那么它们对于其他ififs尤其不是很理想,特别是其他很多elseifs。
<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>
'd。
如果我绝对必须,我作用域的变量,因为我证明,让我知道源,因为......
select * from #thetable#
可能凑巧用的url.thetable或形式的源告终。该表对SQL注入来说是灾难性的和开放的。
更多的建议,因为你只是CF起步,你应该开始一个很好的(和极为重要的)习惯现在<cfqueryparam>
每#变量#你的查询的where子句。它也应该用于插入或更新查询中的每个用户可配置变量。这样做总是很重要的。 (不幸的是,你不能使用cfqueryparam一个动态表名)。
阅读上cfqueryparam这里:cfqueryparam
标签可以看冗长的(并且是,我永远也不会知道是什么土坯的想法),但它是你对SQL Injection的第一道防线。
你想在数据库或ColdFusion变量上使用if条件吗? – 2014-12-03 11:41:44
以供参考,以上是无效的cfml/cfscript代码。在可能的情况下,您应该发布一个[*自包含的* repro案例](http://www.sscce.org/)。另外,总是包含你的dbms类型和SQL问题。 – Leigh 2014-12-03 13:49:13