SQL - Выражение CASE внутри, ГДЕ

link_to всегда помещает аргументы в строку запроса при создании HTML-ссылки в стиле get - даже если вы добавляете: method =>: post, которая просто добавляет дополнительный («special») ) аргумент _метод.

То, что будет работать в соответствии с вашими требованиями, это помощник button_to , предоставляемый rails, который превратит его в форму-пост.

Пожалуйста, перейдите по приведенной ниже ссылке для получения более подробной информации:

https://apidock.com/rails/ActionView/Helpers/UrlHelper/button_to

7
задан casperOne 7 May 2013 в 13:43
поделиться

12 ответов

После чтения Вашего объяснения существует лучший способ сделать это без CASE:

WHERE @ContractNo = 0 OR tblContracts.ContractNo = @ContractNo

Это возвратит только соответствие номерам контракта, если @ContractNo 0, в этом случае это возвратит все записи.

Править: Я только что заметил, что casperOne предложил то же самое. Я не видел это. Большой самостоятельно.

7
ответ дан 6 December 2019 в 07:53
поделиться

Вы уверены, что хотите сделать это? Ваш оператор выбора ВСЕГДА возвращается @ContractNo. Я думаю, что Вы ищете, это:

where 
    case @ContractNo 
        when 0 then tblContracts.ContractNo 
        else @ContractNo 
    end = tblContracts.ContractNo

Фильтр выше говорит, "дают мне контракт где ContractNo равняется параметру или всем им, если параметр 0.

Предыдущий фильтр только фильтровал, где поле номера контракта точно равно параметру.

Независимо, необходимо сделать это вместо этого:

where @ContractNo = 0 or @ContractNo = tblContracts.ContractNo

Логику намного легче понять, и к тому же (не заключайте мне в кавычки на этом), оптимизатор, вероятно, будет работать лучше за пределами оператора выбора.

9
ответ дан 6 December 2019 в 07:53
поделиться

Попытайтесь не учесть круглые скобки, которые находятся в неправильном месте так или иначе - правильный должен быть после "КОНЦА".

2
ответ дан 6 December 2019 в 07:53
поделиться

Возможно, Вы забыли объявлять @ContractNo? Действительно ли это сопоставимо с 0 и с tblContracts. ContractNo?

2
ответ дан 6 December 2019 в 07:53
поделиться

Сообщение Recursive решило мою проблему точно.

Я видел жалобы на ясность моего исходного сообщения. В будущем, что я могу сделать для создания то, что я говорю более прямой? Я не привык к формулировке вопросов о коде и приношу извинения за любые запутанные вещи, которые это имело. Я должен был просто предоставить расширенную подробную информацию как в моем 2-м сообщении?

Еще раз спасибо за всю справку.

1
ответ дан 6 December 2019 в 07:53
поделиться

Переместите свою близкую круглую скобку в перед = как так:

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) не объявляется в пределах Вашего запроса/процедуры. Но кто-то уже указал на это, таким образом, я не могу взять кредит на это.

1
ответ дан 6 December 2019 в 07:53
поделиться

Причина оператора выбора, включая целое, "Если это 0, дает параметр, и иначе, просто дает параметр", должен был протестировать его, чтобы попытаться разобраться в синтаксисе. Первоначально, я попытался говорить, "Если это 0, затем передайте в '%', для возвращения каждого значения. Код, который я отправил там, был то, потому что я продолжал получать 'Недопустимый параметр' и полагал, что должно быть что-то не так с моим синтаксисом. Когда я разделил его на основной параметр, соответствующий как так,

WHERE @ContractNo = tblContracts.ContractNo

это возвратило прекрасные записи. Позвольте мне объяснить немного больше.

Я вытягиваю от набора различных таблиц и фильтрую содержание с информацией, не включенной в избранный оператор (т.е. tblContracts не вытягивал информацию от него Выбор, это используется только в Где). Пользователь выберет из поля комбинированного списка, которое будет иметь различные номера контракта, а также значение по умолчанию 'Всех'.

Я собираюсь иметь событие для того, когда индекс поля комбинированного списка изменяется. Если это будет, то 'Все', 0 будет передано в в качестве параметра, и я не хочу сделанной фильтрации. Иначе я просто Еще хочу информацию для того номера контракта (причина @ContractNo).

1
ответ дан 6 December 2019 в 07:53
поделиться

Разве Вы не имеете в виду что-то вроде этого?

SELECT * 
    FROM tblContracts
    WHERE     
    CASE 
       WHEN tblContracts.ContractNo = 0 THEN @ContractNo 
       ELSE tblContracts.ContractNo
    END = tblContracts.ContractNo

Где @ContractNo является переменной того же типа данных как tblContracts. ContractNo

0
ответ дан 6 December 2019 в 07:53
поделиться

Почему Вам даже нужен оператор выбора?

Когда @ContractNo = 0 затем (0 = tblContracts. ContractNo) еще @ContractNo затем (@ContractNo = tblContracts. ContractNo)

Это не имеет никакого смысла, так как Вы могли просто записать это как

Где @contractNo = tblContracts.contractNo

0
ответ дан 6 December 2019 в 07:53
поделиться

Номер контракта на самом деле числовое или это строка, которая всегда, оказывается, числовое. Проверьте свои типы данных между таблицей и параметром и Оператором выбора (например, "= 0" или "= '0'")

0
ответ дан 6 December 2019 в 07:53
поделиться

Этот синтаксис должен работать (он делает в Oracle),

WHERE CASE WHEN tblContracts.ContractNo = 0 
           THEN @ContractNo 
           ELSE tblContracts.ContractNo
      END = tblContracts.ContractNo
0
ответ дан 6 December 2019 в 07:53
поделиться

когда вы говорите:

Я вытягиваю из множества разных таблиц и фильтрую содержимое информацией не включается в оператор select (т.е. tblContracts не получает информацию, извлеченную из него с помощью Select, он используется только в Where). Пользователь будет выбирать из поля со списком, в котором будут разные номера контрактов, а также значение по умолчанию «Все».

Тогда мне кажется, что должно быть предложение «Где существует». так как вы не извлекаете информацию из этой таблицы ?!

0
ответ дан 6 December 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: