Как мне удалить строку из запроса ColdFusion?

#coldfusion #railo

#coldfusion #railo

Вопрос:

Задан запрос (псевдокод):

 <cfquery name="myquery">SELECT * FROM stuff</cfquery>
  

Как мне избавиться от первой записи? В этом случае изменение SQL не является вариантом.
Я пытался: myquery.RemoveRows(0,1); но получил ошибку:

 No matching Method/Function for Query.REMOVEROWS(numeric, numeric) found
  

Кстати, я на Railo 3

Комментарии:

1. Функция removeRow — отличное решение. Но почему вы хотите удалить строку? В зависимости от того, что вы делаете со своим запросом, могут быть другие способы достижения того же результата без удаления строк запроса.

2. Я понимаю, что было бы лучше сделать это в запросе, но фреймворк, который я использую в этом случае (CFWheels), не принимает аргумент offest в своем методе findAll(). Я мог покопаться и немного запачкать руки, но это дает хорошее однострочное решение

Ответ №1:

О чудо:

 myquery.RemoveRow(1);
  

Делает именно то, что я хотел. Предоставьте Railo действовать немного по-другому!

Комментарии:

1. Неплохо. Я не подумал проверить документы Railo, чтобы узнать, существует ли реализация, специфичная для Railo.

Ответ №2:

Не могу придумать, как сразу удалить строку из исходного объекта. Две вещи, о которых я могу подумать, это:

  1. выполните запрос запросов. Это предполагает, что вы сможете идентифицировать записи, которые вам не нужны, и указать их в WHERE .

  2. создайте новый запрос с помощью queryNew(). Повторите исходный запрос, выполнив querySetCell() в новом запросе для нужных записей. Эта функциональность может быть довольно легко встроена в UDF. На самом деле, заявление об этом заставило меня задуматься о проверке cflib.org . Смотрите # 3

  3. Проверьте cflib.org 🙂 Смотрите http://www.cflib.org/udf/QueryDeleteRows

Комментарии:

1. Что ж, вместо того, чтобы грустить из-за отсутствия встроенного метода, порадуйтесь, что в этом случае есть (как минимум) 2 способа обойти это 🙂

Ответ №3:

«removeRows» на самом деле является вызовом базового метода Java, поэтому вы должны привести эти числа. вот так:

 myquery.RemoveRows(
    JavaCast( "int", 0 ) // starting row, zero-based
    ,JavaCast( "int", 1 ) // number to delete, returns error if too many
)
  

Так что, вероятно, метод «int, int», и если вы его не применяете, он выглядит как «числовой, числовой». Кто-то может возразить, что это недокументировано, но это настолько лаконично, что вы могли бы (как это сделал я) обернуть это в функцию, так что, если это изменится, вам просто нужно заменить содержимое функции альтернативным обходным путем.

Ответ №4:

Railo добавила removeRows, смотрите здесь. Мой ACF-код, который использует этот метод, теперь также выполняется в Railo, без изменений.

Благодаря этому реализация Railo теперь соответствует ACF. (Обратите также внимание, что исходная реализация Railo была основана на 0, в то время как новая и версия ACF основаны на 1.)

Ответ №5:

Обычно я делаю это с помощью запроса, состоящего из запросов, таких как следующий:

 SELECT * FROM myquery
LIMIT {1,10000}
  

Это должно работать в Railo. Что он делает, так это смещает запрос на единицу и извлекает 10000 записей.

Вы также могли бы сделать это:

 SELECT * FROM myquery
WHERE {primarykey} <> {value}
  

Где он выбирает все записи, кроме значения первичного ключа, которое вы передаете.

Потрясающая особенность ColdFusion в том, что существует множество способов сделать именно то, что вы ищете.

Ответ №6:

Вы могли бы просто пропустить строку при обработке результатов:

 <cfoutput query="myquery">
  <cfif myquery.currentrow GT 1>
    <!---Do the work here. --->
  </cfif>
</cfoutput>
  

Комментарии:

1. или просто установите startrow = 2, чтобы избежать необходимости выполнять оператор IF на каждой итерации запроса.

2. Ну, это зависит от того, сколько вы выводите. Если это миллионы строк, нет, вы не хотели бы запускать cfif на каждой итерации. Но если вы отображаете небольшое количество, пропустить эту 1-ю строку может быть проще и так же быстро, как изменить объект запроса, чтобы удалить строку 1.