SQL - ORDER BY в IF-ELSE CLAUSE - PullRequest
       19

SQL - ORDER BY в IF-ELSE CLAUSE

1 голос
/ 02 ноября 2010

У меня есть ОДНА таблица A, и если параметры @x равны 0, я хочу заказать A по дате, иначе по имени.Это пример:

declare @x int set @x = 0
if(@x=0)(
SELECT *  FROM A
order by DATE
)
else
(
SELECT *  FROM A
order by Name
)

При попытке сделать это SQL Server возвращает 2 обычную ошибку как

Неверный синтаксис рядом с ключевым словом 'order'.

Что я могделать?

Ответы [ 7 ]

2 голосов
/ 02 ноября 2010

Попробуйте вместо этого

SELECT * FROM A
order by 
Case @x When 0 Then Cast(DATE as sql_variant) Else Name End

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

Вот ссылка на некоторые варианты.Обратите внимание на раздел о смешанных типах данных.

http://www.4guysfromrolla.com/webtech/010704-1.shtml

1 голос
/ 02 ноября 2010
SELECT
  *
FROM
  A
ORDER BY
  CASE WHEN @x = 0 THEN Date ELSE Name END
1 голос
/ 02 ноября 2010
declare @x int set @x = 0 
if(@x=0)
begin 
 SELECT *  FROM A 
 order by DATE 
end
else 
begin
 SELECT *  FROM A 
 order by Name 
end
0 голосов
/ 02 ноября 2010

Как отмечено в ответах, но не объяснено.

SQL использует синтаксис BEGIN - END вместо () или {} для блока команд

0 голосов
/ 02 ноября 2010

Скобки ( и ) неверны .Вместо этого используйте BEGIN и END.

DECLARE @x INT 
SET @x = 0

IF (@x = 0) BEGIN
    SELECT * FROM A ORDER BY DATE
END
ELSE BEGIN
    SELECT * FROM A ORDER BY Name
END

Также, на мой взгляд, DATE в качестве имени столбца является не очень хорошая идея .

0 голосов
/ 02 ноября 2010

Если ваш запрос становится достаточно сложным, то копирование его в обе стороны IF / ELSE может стать довольно обременительным. Вместо этого вы можете использовать выражение CASE в своем ORDER BY. В этом случае вы можете сделать:

SELECT * FROM A ORDER BY CASE WHEN @x=0 THEN DATE END, CASE WHEN @x<>0 THEN Name END

Это может быть расширено до большего количества условий / столбцов. Вам просто нужно убедиться, что каждое выражение CASE возвращает разумный тип данных.

0 голосов
/ 02 ноября 2010
declare @x int 
set @x = 0 
IF (@x=0) 
BEGIN
   SELECT * FROM A order by DATE 
END
ELSE
   SELECT * FROM A order by Name
END

http://msdn.microsoft.com/en-us/library/aa933214(SQL.80).aspx

...