SQL Switch / Case в предложении 'where'

Невозможно. Может быть, кто-то докажет, что я ошибаюсь ... Какой код вы хотите запустить? Вы хотите автоматическое сохранение при нажатии кнопки «Отмена»? Это звучит контр-интуитивно. Если вы еще не автосохранение, я думаю, что нет смысла автоматически сохранять, когда они нажимают «Отмена». Возможно, вы могли бы выделить кнопку сохранения в вашем обработчике onbeforeunload, чтобы пользователь увидел, что им нужно сделать, прежде чем перемещаться.

140
задан Peter Mortensen 14 June 2019 в 18:47
поделиться

5 ответов

declare @locationType varchar(50);
declare @locationID int;

SELECT column1, column2
FROM viewWhatever
WHERE
@locationID = 
  CASE @locationType
      WHEN 'location' THEN account_location
      WHEN 'area' THEN xxx_location_area 
      WHEN 'division' THEN xxx_location_division 
  END
184
ответ дан Bob Probst 14 June 2019 в 18:47
поделиться
  • 1
    Мне нравится, насколько прямой это кодирование. – Tyler Rinker 2 January 2012 в 07:31

Здесь Вы идете.

SELECT
   column1, 
   column2
FROM
   viewWhatever
WHERE
CASE 
    WHEN @locationType = 'location' AND account_location = @locationID THEN 1
    WHEN @locationType = 'area' AND xxx_location_area = @locationID THEN 1
    WHEN @locationType = 'division' AND xxx_location_division = @locationID THEN 1
    ELSE 0
END = 1
32
ответ дан Pittsburgh DBA 14 June 2019 в 18:47
поделиться
  • 1
    Sry, отредактированный мой ответ выше. Это должно быть корректно теперь.. – Kay 2 January 2012 в 07:57

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

, Если Вы неспособны изменить структуру, что-то как ниже могло бы работать:

SELECT
    *
FROM
    Test
WHERE
    Account_Location = (
        CASE LocationType
          WHEN 'location' THEN @locationID
          ELSE Account_Location
        END
    )
    AND
    Account_Location_Area = (
        CASE LocationType
          WHEN 'area' THEN @locationID
          ELSE Account_Location_Area
        END
    )

И т.д... Мы не можем изменить структуру запроса на лету, но мы можем переопределить его, заставив предикаты равняться себе.

РЕДАКТИРОВАНИЕ: вышеупомянутые предложения, конечно, намного лучше, просто игнорируют мой.

6
ответ дан Sk8erPeter 14 June 2019 в 18:47
поделиться

Проблема с этим состоит в том, что, когда механизм SQL идет для оценки выражения, он проверяет ОТ части для получения по запросу надлежащих таблиц, и затем, ГДЕ часть для обеспечения некоторых основных критериев, таким образом, он не может правильно оценить динамическое условие на который столбец проверить по.

можно использовать оператор Where, когда Вы проверяете, КУДА критерии в предикате, такой как

WHERE account_location = CASE @locationType
                              WHEN 'business' THEN 45
                              WHEN 'area' THEN 52
                         END

так в Вашем особом случае, Вы собираетесь должны поместить запрос в хранимую процедуру или создать три отдельных запроса.

5
ответ дан Dillie-O 14 June 2019 в 18:47
поделиться
  • 1
    Точно, на что я надеялся. Путь, более сложный, что я думал, что это будет. Неудивительный я испытывал затруднения. I' ll действительно разделяют то, что Вы сделали.Спасибо. – Tyler Rinker 2 January 2012 в 03:49

без оператора case ...

SELECT column1, column2
FROM viewWhatever
WHERE
    (@locationType = 'location' AND account_location = @locationID)
    OR
    (@locationType = 'area' AND xxx_location_area = @locationID)
    OR
    (@locationType = 'division' AND xxx_location_division = @locationID)
69
ответ дан 23 November 2019 в 23:04
поделиться
Другие вопросы по тегам:

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