Я все еще думаю, что в CFScript циклы намного проще (не говоря уже о том, что он просто выглядит чище для меня. В любом случае, я могу свести это к одной строке кода (помимо создания массива) и зацикливание кода).
Сначала я настроил свой поддельный объект запроса:
all_employees = QueryNew(
"id, TimeInPositionDate, hiredate" ,
"integer, date, date" ,
[
{
id:1 ,
TimeInPositionDate: "2018-01-01" ,
hiredate: "2017-01-01"
} ,
{
id:2 ,
// TimeInPositionDate: Not defined, so NULL
hiredate: "2017-02-01"
} ,
{
id:3 ,
TimeInPositionDate: "2018-03-01"
//hiredate: Not defined, so NULL
} ,
{
id:4
//TimeInPositionDate: Not defined, so NULL
//hiredate: Not defined, so NULL
}
]
);
Я создал 3 строки. 1 полная строка, 1 с TimeInPositionDate
, 1 с hiredate
и 1 с ни тем, ни другим. ColdFusion всегда был немного странным с тем, как он обрабатывает null
, и он не всегда хорошо сочетается с запросом SQL. В нашем поддельном запросе мы просто не определяем строки, которыми мы хотим быть null
.
Далее я создаю свой массив:
Seniority = [] ;
Нам не нужно использовать ArrayNew()
для создания массива. Мы можем просто использовать неявную запись, чтобы быть намного короче.
Далее мы используем цикл for/in
вокруг нашего запроса, чтобы добавить данные строки в наш новый массив.
for (r in all_employees) {
Seniority.append( len(r.TimeInPositionDate) ? r.TimeInPositionDate : r.hiredate ) ;
}
Здесь мы используем функцию-член append()
для добавления в наш массив Seniority
. Мы также используем троичную операцию, чтобы выбрать, какое значение мы хотим добавить. В основном это говорит о том, что если для этой строки есть длина до TimeInPositionDate
, то мы используем первое условие (TimeInPositionDate
), в противном случае мы используем hiredate
.
Я думаю об использовании оператора Элвиса ...
Seniority2.append( q.TimeInPositionDate ?: q.hiredate ) ;
..., но поскольку запрос скорее всего возвращает q.TimeInPositionDate=""
вместо действительного значения null
, то первое значение технически определено и выбрано. Это будет работать для истинного null
, но пустая строка не является null
.
Возможно, вы могли бы также использовать each()
или какую-либо другую циклическую функцию для итерации по вашему объекту запроса, но я обнаружил, что циклы for/in
обычно бывают быстрее в подобных случаях. Вам придется проверить.
Вы можете играть с полной вещью по адресу:
https://cffiddle.org/app/file?filepath=de107907-234c-4df8-9386-02a288e53313/fdf21791-6cc4-4c55-b923-ad7726efa8ee/b3b6b906-8e3a-4f6b-9ec8-65845efc40f1.cfm
РЕДАКТИРОВАТЬ : NULL
s может быть очень весело. Если мы вернемся к какой-то Java, мы сможем получить фактическое значение null
из запроса, а не преобразованную cfquery
пустую строку, и показать, что Элвис все еще находится в здании.
all_employees.getDate("TimeInPositionDate") ?: all_employees.getDate("hiredate") ) ;
Поскольку Java getDate()
в запросе получит фактическое значение и может обработать null
, это правильно выбирает 2-й вариант для строк, где TimeInPositionDate
равно null
. Тем не менее, хотя я ценю интеграцию Java и ColdFusion, я не рекомендую ее в этом случае. Он смешивает Java с CF и не нуждается в демонстрации.