Sql server SQL-IF-ELSE子句中的ORDER BY

Sql server SQL-IF-ELSE子句中的ORDER BY,sql-server,if-statement,sql-order-by,Sql Server,If Statement,Sql Order By,我有一个表A,如果参数@x为0,我想按日期排序,否则按名称排序。 这是一个例子: 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”附近的语法不正确 我能做什么 declare @x int set @x = 0 if(@x=0) begin

我有一个表A,如果参数
@x
为0,我想按日期排序,否则按名称排序。 这是一个例子:

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”附近的语法不正确

我能做什么

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


如果查询变得相当复杂,那么将其复制到If/ELSE的两侧会变得相当繁重。您可以改为在ORDER BY中使用大小写表达式。在这种情况下,您可以执行以下操作:

SELECT * FROM A ORDER BY CASE WHEN @x=0 THEN DATE END, CASE WHEN @x<>0 THEN Name END
当@x=0时,按大小写从订单中选择*然后选择日期结束;当@x0时,按大小写从订单中选择*然后选择名称结束

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

如果查询变得相当复杂,那么将其复制到If/ELSE的两侧可能会变得相当繁重。您可以改为在ORDER BY中使用大小写表达式。在这种情况下,您可以执行以下操作:

SELECT * FROM A ORDER BY CASE WHEN @x=0 THEN DATE END, CASE WHEN @x<>0 THEN Name END
当@x=0时,按大小写从订单中选择*然后选择日期结束;当@x0时,按大小写从订单中选择*然后选择名称结束
这可以扩展到更多条件/列。您只需要确保每个CASE表达式都返回一个合理的数据类型。

试试这个

SELECT * FROM A
order by 
Case @x When 0 Then Cast(DATE as sql_variant) Else Name End
强制转换是动态排序处理日期所必需的—我正在尝试查找引用,但您需要一个可以自动强制转换为普通类型的类型,而日期无法完成。因此,铸造你自己

这里有一些选项的链接。请注意关于混合数据类型的部分

试试这个

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

另外,在我看来,
日期
作为列名不是一个好主意
括号
是错误的。改用
开始
结束

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

另外,在我看来,
日期
作为列名不好的主意

如答案中所述,但没有解释


SQL使用BEGIN-END语法,而不是()或{}作为命令块

,如答案中所述,但没有解释


SQL对命令块使用BEGIN-END语法,而不是()或{},假设
DATE
是日期类型,name是字符串类型,我不确定它是否有效。转换为variant会有所帮助,但这可能会影响索引的使用(以一种不好的方式)。假设
DATE
是日期类型,name是字符串类型,我不确定它是否会起作用。转换为variant会有所帮助,但这可能会影响索引的使用。