我有一个表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'附近的语法不正确。
我能做什么?
答案 0 :(得分:2)
试试这个
SELECT * FROM A
order by
Case @x When 0 Then Cast(DATE as sql_variant) Else Name End
动态排序需要进行转换才能使用日期 - 我正在尝试查找引用,但是您需要一种可以自动转换为公共类型的类型,并且无法完成日期。因此投下自己。
这是一些选项的链接。请注意有关混合数据类型的部分。
答案 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)
圆括号 (
和)
错误。请改用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
列名称 不是好主意。
答案 6 :(得分:0)
如答案中所述但未解释。
SQL使用BEGIN - END语法而不是()或{}来执行命令块