[英]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
动态排序需要进行转换才能使用日期 - 我正在尝试查找引用,但是您需要一种可以自动转换为公共类型的类型,并且无法完成日期。 因此投下自己。
这是一些选项的链接。 请注意有关混合数据类型的部分。
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表达式返回一个合理的数据类型。
括号 (
和)
是错误的 。 请改用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
作为列名 并不是一个好主意 。
如答案中所述但未解释。
SQL使用BEGIN - END语法而不是()或{}来执行命令块
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.