動態組裝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