cfsavecontent отображать двойной апостроф в операторе SQL - PullRequest
1 голос
/ 19 сентября 2019

У меня в операторе SQL несколько OR, поэтому я хочу сохранить их в cfsavecontent.Вот эта часть:

<cfsavecontent variable="checkDepartment">
    <cfif #wrkDept# EQ #dept[2][1]#>
        Department = 'Health' AND
    <cfelse>
    Department = '#wrkDept#' AND
    </cfif>
</cfsavecontent>

Но ошибка, которую я получаю на странице, показывает 2 набора апострофов вокруг слова Здоровье.

SQL   
 SELECT COUNT(*) AS numItems
 FROM   IT_PROJECTS
 WHERE 
 Department = ''Health'' AND
 status = 'Cancelled'

Может ли кто-нибудь помочь мне получить только один апостроф?Спасибо

1 Ответ

0 голосов
/ 20 сентября 2019

Так что этот ответ кажется намного сложнее, чем на самом деле.И, не зная точно, как выглядит ваш запрос (в отношении 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 с, я постараюсь изменить это для вас.

...