Сборка запроса 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>
троичной МСФ могут быть использованы в строках Li ke Вы пытаетесь сделать:
<cfset myfavcolor = "green">
<cfset yourfavcolor "red">
<cfset DoWeAgree = "We have #(myfavcolor is yourfavcolor ? "the same favorite color" : "different favorite colors")#">
Однако они работают на очень простой природе If/else. Единственный путь к другому, если нужно вложить еще один Ternary, если, поэтому они действительно не идеальны для elseifs, особенно для многих 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>
Таким образом, в зависимости от того таблица тянет из, вы можете ссылаться на таблицу (в пределах запроса) в качестве theTB.
Теперь, для некоторых советов.
Если вы чувствуете необходимость загрузки имя таблицы в имя переменной
select * from #thetable#
Убедитесь, что объем этой переменной. Если это то, что вы установили на странице, установите его, как этот
<cfset variables.thetable = "mytable">
и
select * from #variables.thetable#
Но, как правило, я избегаю сбросив переменную в запрос, если я не могу <cfqueryparam>
и имена таблиц не могут быть <cfqueryparam>
'd.
Если я абсолютно необходим, я масштабы этот переменный, как я продемонстрировал, так что я знаю источник, потому что ...
select * from #thetable#
Может случайно оказаться с источником url.thetable или формы. которая катастрофична и открыта для SQL Injection.
Дополнительных советы, так как вы только начинаете с CF, вы должны начать хорошую (и критически важную) привычку Теперь <cfqueryparam>
каждую # переменной # в ИНЕКЕ запросов. Он также должен использоваться для каждой настраиваемой пользователем переменной в запросах на вставку или обновление. Это всегда важно. (К сожалению, вы не можете cfqueryparam динамическое имя таблицы).
Читайте на cfqueryparam здесь: cfqueryparam
Тег может выглядеть longwinded (и это, я никогда не буду знать, о чем думает саман), но это ваша первая линия обороны против SQL Injection.
Вы хотите использовать условие в базе данных или переменной ColdFusion? –
Для справок в будущем вышесказанное недействительно cfml/cfscript. Когда это возможно, вы должны опубликовать [* автономный * случай воспроизведения] (http://www.sscce.org/). Кроме того, всегда включайте свой тип dbms с вопросами SQL. – Leigh