link_to всегда помещает аргументы в строку запроса при создании HTML-ссылки в стиле get - даже если вы добавляете: method =>: post, которая просто добавляет дополнительный («special») ) аргумент _метод.
То, что будет работать в соответствии с вашими требованиями, это помощник button_to , предоставляемый rails, который превратит его в форму-пост.
Пожалуйста, перейдите по приведенной ниже ссылке для получения более подробной информации:
https://apidock.com/rails/ActionView/Helpers/UrlHelper/button_to
После чтения Вашего объяснения существует лучший способ сделать это без CASE
:
WHERE @ContractNo = 0 OR tblContracts.ContractNo = @ContractNo
Это возвратит только соответствие номерам контракта, если @ContractNo
0, в этом случае это возвратит все записи.
Править: Я только что заметил, что casperOne предложил то же самое. Я не видел это. Большой самостоятельно.
Вы уверены, что хотите сделать это? Ваш оператор выбора ВСЕГДА возвращается @ContractNo
. Я думаю, что Вы ищете, это:
where
case @ContractNo
when 0 then tblContracts.ContractNo
else @ContractNo
end = tblContracts.ContractNo
Фильтр выше говорит, "дают мне контракт где ContractNo
равняется параметру или всем им, если параметр 0.
Предыдущий фильтр только фильтровал, где поле номера контракта точно равно параметру.
Независимо, необходимо сделать это вместо этого:
where @ContractNo = 0 or @ContractNo = tblContracts.ContractNo
Логику намного легче понять, и к тому же (не заключайте мне в кавычки на этом), оптимизатор, вероятно, будет работать лучше за пределами оператора выбора.
Попытайтесь не учесть круглые скобки, которые находятся в неправильном месте так или иначе - правильный должен быть после "КОНЦА".
Возможно, Вы забыли объявлять @ContractNo? Действительно ли это сопоставимо с 0 и с tblContracts. ContractNo?
Сообщение Recursive решило мою проблему точно.
Я видел жалобы на ясность моего исходного сообщения. В будущем, что я могу сделать для создания то, что я говорю более прямой? Я не привык к формулировке вопросов о коде и приношу извинения за любые запутанные вещи, которые это имело. Я должен был просто предоставить расширенную подробную информацию как в моем 2-м сообщении?
Еще раз спасибо за всю справку.
Переместите свою близкую круглую скобку в перед = как так:
WHERE (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END)=tblContracts.ContractNo
Мне не удается видеть то, что сделает этот оператор выбора, хотя... Вы возвращаете то же самое в конечном счете @ContractNo = 0 или если это не...
Правильный синтаксис:
Select...
...
Where(
Case
When <Condition>
Then <Return if true>
Else <Return if false>
End
) = <Whatever is being matched to the output of the case statement>
Независимо от синтаксиса, хотя, Ваш пример не имеет большой смысл при поиске всех объектов, которые соответствуют или имеют Номер контракта 0, затем Вы сделали бы:
Select...
...
Where (
@ContractNo = 0 Or
@ContractNo = tblContracts.ContractNo
)
Который, кажется, имеет намного больше смысла, чем, для чего Вы пытаетесь использовать оператор выбора.
Править: Я, должно быть, неправильно читал вопрос немного - недостающий параметрический усилитель обычно означает, что параметр (в этом случае @ContractNo) не объявляется в пределах Вашего запроса/процедуры. Но кто-то уже указал на это, таким образом, я не могу взять кредит на это.
Причина оператора выбора, включая целое, "Если это 0, дает параметр, и иначе, просто дает параметр", должен был протестировать его, чтобы попытаться разобраться в синтаксисе. Первоначально, я попытался говорить, "Если это 0, затем передайте в '%', для возвращения каждого значения. Код, который я отправил там, был то, потому что я продолжал получать 'Недопустимый параметр' и полагал, что должно быть что-то не так с моим синтаксисом. Когда я разделил его на основной параметр, соответствующий как так,
WHERE @ContractNo = tblContracts.ContractNo
это возвратило прекрасные записи. Позвольте мне объяснить немного больше.
Я вытягиваю от набора различных таблиц и фильтрую содержание с информацией, не включенной в избранный оператор (т.е. tblContracts не вытягивал информацию от него Выбор, это используется только в Где). Пользователь выберет из поля комбинированного списка, которое будет иметь различные номера контракта, а также значение по умолчанию 'Всех'.
Я собираюсь иметь событие для того, когда индекс поля комбинированного списка изменяется. Если это будет, то 'Все', 0 будет передано в в качестве параметра, и я не хочу сделанной фильтрации. Иначе я просто Еще хочу информацию для того номера контракта (причина @ContractNo).
Разве Вы не имеете в виду что-то вроде этого?
SELECT *
FROM tblContracts
WHERE
CASE
WHEN tblContracts.ContractNo = 0 THEN @ContractNo
ELSE tblContracts.ContractNo
END = tblContracts.ContractNo
Где @ContractNo является переменной того же типа данных как tblContracts. ContractNo
Почему Вам даже нужен оператор выбора?
Когда @ContractNo = 0 затем (0 = tblContracts. ContractNo) еще @ContractNo затем (@ContractNo = tblContracts. ContractNo)
Это не имеет никакого смысла, так как Вы могли просто записать это как
Где @contractNo = tblContracts.contractNo
Номер контракта на самом деле числовое или это строка, которая всегда, оказывается, числовое. Проверьте свои типы данных между таблицей и параметром и Оператором выбора (например, "= 0" или "= '0'")
Этот синтаксис должен работать (он делает в Oracle),
WHERE CASE WHEN tblContracts.ContractNo = 0
THEN @ContractNo
ELSE tblContracts.ContractNo
END = tblContracts.ContractNo
когда вы говорите:
Я вытягиваю из множества разных таблиц и фильтрую содержимое информацией не включается в оператор select (т.е. tblContracts не получает информацию, извлеченную из него с помощью Select, он используется только в Where). Пользователь будет выбирать из поля со списком, в котором будут разные номера контрактов, а также значение по умолчанию «Все».
Тогда мне кажется, что должно быть предложение «Где существует». так как вы не извлекаете информацию из этой таблицы ?!