Не хватало некоторых подробностей о приложении и данных, поэтому я сделал пару предположений. Похоже, у вас есть объект запроса, который вы хотите отфильтровать и получить оценки для origCode
и toCode
. Не зная больше о вашей структуре данных и о том, что вы планируете с ней делать, я могу лишь сделать несколько общих предложений. Я по-прежнему утверждаю, что фильтрация в запросе была бы намного лучше, но я понимаю ограничения. Поскольку вам необходимо фильтровать внутри приложения, как большая часть базовых данных, которые вы изначально возвращаете, так и обработка для фильтрации этих записей будут негативно влиять на производительность.
Первое, что я сделал, это создал поддельный объект запроса. Вот где мое первое предположение вступает в игру. Я предположил, что ваш code
не будет дублироваться в вашей таблице и что код будет иметь связанный с ним rate
.
myQuery = queryNew(
"code, rate",
"integer, integer",
[
{ "code" : 1 , "rate" : 10 } ,
{ "code" : 2 , "rate" : 15 } ,
{ "code" : 3 , "rate" : 20 } ,
{ "code" : 4 , "rate" : 25 } ,
{ "code" : 5 , "rate" : 30 }
]
);
Я бы не рекомендовал здесь Query of Query, потому что это требует больших накладных расходов для чего-то, что может быть выполнено довольно легко.
Я создал функцию, которую вы можете передать в свои origCode
и toCode
, и она вернет вам структуру origRate
и toRate
. Я включил некоторые комментарии в код, чтобы вы могли видеть, что я делаю. Основная часть функции использует замыкание filter()
для фильтрации записей запроса. Если вы можете фильтровать через SQL, вы сможете устранить этот блок.
function returnNewRates( required Numeric origCode, required Numeric toCode ) {
local.ratesStruct = { "origRate":-1, "toRate":-1 } ;
// This will be our query. If we _have_ to use an existing query, pass it in and duplicate() it. (Pass by Reference!)
local.qry = duplicate( myQuery ) ;
/////////////
// Closure to filter the query. This should be done in SQL.
// https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-m-r/queryfilter.html
local.filteredQuery = qry
.filter( function (obj) {
return ( obj.code == origCode || obj.code == toCode ) ;
} ) ;
// Now assign new rates. NOTE: The query shouldn't return more than 2 rows. We can validate if needed.
for ( var r IN filteredQuery ) {
if( r.code == arguments.origCode ) { ratesStruct.origRate = r.rate ; }
if( r.code == arguments.toCode ) { ratesStruct.toRate = r.rate ; }
}
return ratesStruct ;
}
Чтобы назначить origRate
и toRate
, мы сначала создаем возвращаемое значение ratesStruct
, чтобы сохранить структуру ставок. После того, как мы отфильтровали наш запрос, мы просто просматриваем эти отфильтрованные результаты и проверяем, соответствует ли code
в строке нашим входным переменным. Еще одно из моих предположений заключалось в том, что база данных будет возвращать не более двух записей (одну origCode
и одну toCode
или ни одну). Если возможно вернуть более одной строки для code
, то выходные коды будут перезаписаны последней связанной строкой в запросе. Если есть другие строки, подходящие для сортировки, то их можно использовать и выбрать только верхнюю строку для нужной ставки. Я также по умолчанию установил для возвращаемых ставок значение -1, чтобы показать, что для code
не найдено rate
. Это можно изменить при необходимости.
После этого я просто провел несколько тестов, чтобы убедиться, что у нас нет шатаний. Код находится по адресу https://trycf.com/gist/c3b87ca7c508562fd36f3ba6c73829c7/acf2016? а>.
И опять же, я думаю, что все это можно сделать внутри самой базы данных. Возможно, предоставив вам доступ к хранимой процедуре, которой вы можете передать origCode
и toCode
.
person
Shawn
schedule
29.11.2018
not working
слишком расплывчато. Укажите ожидаемые и фактические результаты для этого кода. - person Dan Bracuk   schedule 28.11.2018tags
наscript
для цикла?for
петли так же просты, как<cfloop>
. Например,for (rate in rates) {...}
petefreitag.com/cheatsheets/coldfusion/cfscript Ваша условная логика выглядит неправильно. к. Должно бытьrate = (code EQ arguments.origCode) ? origRate : "";
- person fyroc   schedule 28.11.2018myquery
и просмотром этих результатов? Возможно, вам даже не потребуется выполнять два разных прохода по результатам запроса. Можете ли вы предоставить некоторые основные данные и некоторые основные ожидания в отношении того, что вы хотите? - person Shawn   schedule 28.11.2018filter()
может сделать с запросом то же самое, что и предложениеWHERE
, но SQL НАМНОГО лучше выполняет эту фильтрацию. Если вы хотите использоватьfilter()
в запросе, это действительно необходимо только в том случае, если вам нужно также использовать базовый запрос (или другую отфильтрованную версию) где-то еще. - person Shawn   schedule 28.11.2018myQuery
возвращать более одной строки для ставок? Вам нужно зациклить его? Если вы это сделаете, вы перезапишетеorigRate
иtoRate
тем, что окажется последней строкой запроса. - person Shawn   schedule 28.11.2018origCode
иtoCode
в свой запрос, чтобы получить обратноorigRate
иtoRate
. Может ли значениеcode
дублироваться в вашей таблице или этот столбец уникален? И могут лиorigCode
иtoCode
быть одним и тем же значением, чтобы тянуть один и тот жеrate
? Кажется, есть много дополнительной обработки, которую можно реорганизовать. Можете ли вы предоставить некоторые примеры данных и что вы ожидаете получить? - person Shawn   schedule 29.11.2018