Так что этот ответ кажется намного сложнее, чем на самом деле.И, не зная точно, как выглядит ваш запрос (в отношении OR
условий), я не совсем уверен, как его структурировать.Это может быть лучше.Цель должна состоять в том, чтобы совершить одну поездку на ваш SQL-сервер с запросом, наиболее подходящим для данных, которые вы пытаетесь получить.Я не уверен, что вы пытаетесь сделать с cfsavecontent
, но я не думаю, что вам это нужно.
Основная часть моего примера запроса (https://trycf.com/gist/4e1f46bfa84a6748aced0f9ee8221c6d/acf2016?theme=monokai) настроена. Я решил использовать формат cfscript, потому что, как сказал Redtopia, мне также гораздо проще создать динамический запрос в cfscript.
После начальной настройки я в основном просто записываю переменные, которые буду использовать в своем окончательном queryExecute()
.
// Base query.
qry = "SELECT count(*) AS theCount FROM IT_PROJECTS WHERE 1=1 " ;
// This is our dynamic filter that we build below.
qfilter = {} ;
// Query options.
opts = { "dbtype":"query" } ;
После того, как у нас будет база, я создаю динамическую частьзапрос. Эта часть, скорее всего, изменится немного в зависимости от ваших текущих потребностей и настроек.
Для первой части я в основном заменил ваш cfif
на троичную оценку. Я не уверенкак ваши данные влияют на оценку dept
или откуда берется этот массив. Но оттуда я строю основную включенную инструкцию запроса и устанавливаю для нее значения queryparam. Затем я добавляю вторую проверку, которая выберет другуюнабор значений для запроса (в настоящее время основанный на четных / нечетных секундах). Опять же, я не уверен в намерении вашего запроса здесь, поэтому я просто сделал что-то динамическое.
//////////// BUILD DYNAMIC FILTER ////////////
qdept = ( wrkDept == dept[2][1] ) ? 'Health' : wrkDept ;
/// This one is an included filter:
qry &= " AND department = :dpt AND status = :sts " ;
qfilter.dpt = {"value":qdept,"cfsqltype":"CFSQLVARCHAR"} ;
qfilter.sts = {"value":"Cancelled","cfsqltype":"CFSQLVARCHAR"} ;
/// Adding Dynamic ORs
// Dynamically set status based on even/odd seconds.
qStatus = ( now().second()%2==0) ? "Cancelled" : "Active" ;
qry &= " OR ( department = :dpt2 AND status = :sts2 ) " ;
qfilter.dpt2 = {value:"IT",cfsqltype:"CFSQLVARCHAR"} ;
qfilter.sts2 = {value:qStatus,cfsqltype:"CFSQLVARCHAR"} ;
TЕго дает нам строку SQL, которая выглядит следующим образом:
SELECT count(*) AS theCount
FROM IT_PROJECTS
WHERE 1=1
AND department = :dpt AND status = :sts
OR
( department = :dpt2 AND status = :sts2 )
С помощью оператора SQL размещение условий AND
и OR
может значительно повлиять на результаты.Используйте скобки, чтобы сгруппировать условия так, как они вам нужны.
После того, как мы построим строку запроса, нам просто нужно подключить ее и наши параметры запроса к queryExecute()
.
result = queryExecute( qry , qfilter , opts ) ;
И если мы хотим вывести наши данные, мы можемgo:
writeOutput("There are " & result.theCount & " records." ) ;
Что дает нам:
There are 8 records.
Опять же, я не знаю, как выглядят ваши основные условия.Если вы можете привести пример запроса с набором OR
с и AND
с, я постараюсь изменить это для вас.