SQL - IF-ELSE CLAUSE中的ORDER BY

时间:2010-11-02 09:59:04

标签: sql-server if-statement sql-order-by

我有一个表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 个答案:

答案 0 :(得分:2)

试试这个

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 :(得分:1)

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

答案 2 :(得分:1)

SELECT
  *
FROM
  A
ORDER BY
  CASE WHEN @x = 0 THEN Date ELSE Name END

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果您的查询变得相当复杂,那么将其复制到IF / ELSE的两侧可能会变得非常繁重。您可以在ORDER BY中使用CASE表达式。在这种情况下,您可以这样做:

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

这可以扩展到更多条件/列。您只需要确保每个CASE表达式都返回一个合理的数据类型。

答案 5 :(得分:0)

圆括号 () 错误。请改用BEGINEND

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 列名称 不是好主意

答案 6 :(得分:0)

如答案中所述但未解释。

SQL使用BEGIN - END语法而不是()或{}来执行命令块