2016-02-11 9 views
2

Я искал онлайн решение, но никто не пришел. У меня есть столбец в запросе coldfusion, «date_hired». Если я делаю cfdump запроса, он показывает как дату, если это дата или как [пустая строка], если нет. В запросе есть 8 записей; и у некоторых есть даты для date_hired, а некоторые нет. Если я пытаюсь сделать добротность Q на этом результирующем:Как проверить нулевую/пустую строку в запросе запроса Coldfusion?

SELECT date_hired 
    FROM myQuery 
    WHERE date_hired = '' 

Я получаю сообщение об ошибке, говорящее: Сравнение исключение при выполнении =. Исключение исключения неподдерживаемых типов: Оператор = не поддерживает сравнение между следующими типами: Тип выражения левой стороны = «NULL». Тип выражения правой стороны = "STRING".

Хорошо, так что я изменить мой запрос:

SELECT date_hired 
    FROM myQuery 
    WHERE date_hired IS NOT NULL 

но он возвращает все 8 строк, даже те, где date_hired является [пустая строка] в cfdump. Аналогично, если я изменил предложение where на «where date_hired IS NULL», я получаю 0 строк, даже не [пустые строки].

Я в затруднении. ISNULL() и LEN() не могут использоваться в q из q. К счастью, если я делаю cfloop запроса и вывод isDate (date_hired), он возвращает true, где он должен, и false, где он должен. Таким образом, я могу cfloop над запросом и построить еще один на лету, но это похоже на окольный способ сделать что-то, что не должно быть трудно. Есть ли какие-то условные условия, которые я могу использовать в предложении where, которое будет работать здесь? Спасибо - CM

+1

Не могли бы вы включить соответствующую часть схемы таблицы в свой пост? И как выглядит запрос перед QoQ? Кроме того, какую версию ColdFusion вы используете? – Alex

ответ

3

Спасибо Алекс за ваш ответ - я, наконец, понял это. В этом случае мой запрос вытягивается через cfquery, затем я добавляю в него несколько столбцов с помощью queryAddColumn(). Одна из этих столбцов - date_hired. Если я попытаюсь выполнить маршрут cfloop, независимо от того, что я установил значения этого столбца (дата или строка), CF сохраняет его как тип NULL (и не будет работать с IS NULL/IS NOT NULL). Таким образом, после некоторых дальнейших исследований, я попытался с помощью функции Cast() в моем где положение:

<cfquery name="numberHired" dbtype="query"> 
     select count(*) 
     from myQuery 
     where CAST(date_hired AS varchar) <> '' 
    </cfquery> 

и он работает как шарм.

+0

Другим подходом без использования циклов может быть преобразование значенияList столбца date_hired в массив, а затем обратно в список. Я понимаю, что избавляется от пустых элементов. Затем получите длину полученного списка, чтобы получить тот же номер, что и q q. –

+0

Вы упомянули, что после запуска вы добавляете date_hired в объект запроса? Это означает, что это должен быть массив. Какой бы код вы не использовали для создания этого массива, можно было бы увеличить число ненулевых значений. –

1

Вот еще один способ, который может работать быстрее. Он использует тот факт, что столбцы запросов могут рассматриваться как массивы.

<cfquery name="dbQuery" datasource="oracleDB"> 
select trunc(sysdate) theDate 
from dual 
union 
select null theDate 
from dual 
union 
select trunc(sysdate - 1) theDate 
from dual 
</cfquery> 

Обратите внимание, что существуют два значения, которые не равны нулю. Это:

<cfdump var="#Listlen(ArrayToList(dbQuery['theDate']))#"> 

возвращает 2, это номер, который вы искали.

Этот метод, вероятно, более эффективен, чем использование Q Q. Однако Q-метод более читабельен, что также важно.

 Смежные вопросы

  • Нет связанных вопросов^_^