繁体   English   中英

SQL - IF-ELSE CLAUSE中的ORDER BY

[英]SQL - ORDER BY in IF-ELSE CLAUSE

我有一个表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个egual错误为

关键字“order”附近的语法不正确。

我能做什么?

试试这个

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

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
SELECT
  *
FROM
  A
ORDER BY
  CASE WHEN @x = 0 THEN Date ELSE Name END
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

如果您的查询变得相当复杂,那么将其复制到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表达式返回一个合理的数据类型。

括号 () 是错误的 请改用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作为列名 并不是一个好主意

如答案中所述但未解释。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM