SQL Server- ORDER BY CASE

时间:2009-04-28 12:46:30

标签: sql sql-server

我有以下动态运行的查询

SELECT *
FROM Vehicles
WHERE (DKID IN (69954))
ORDER BY case when ImageName1 = 'na' then 0 else 1 end, Make , Model, Year DESC

这会返回以下错误:

  

执行数据库查询时出错。   [Macromedia] [SQLServer JDBC   驱动程序] [SQLServer]语法不正确   靠近'na'。

6 个答案:

答案 0 :(得分:6)

您是否动态运行此查询?如果是这样,您可能需要转义'na'周围的引号:

SELECT *
FROM Vehicles
WHERE (DKID IN (69954))
ORDER BY case when ImageName1 = ''na'' then 0 else 1 end, Make , Model, Year DESC

答案 1 :(得分:1)

适合我

这里是repo脚本

use tempdb
go

create table Vehicles(DKID int,ImageName1 varchar(50),
                          Make int, Model int, Year int)

insert Vehicles values (69954,'na',1,1,2007)
insert Vehicles values(69954,'bla',1,1,2008)
go

SELECT *
FROM Vehicles
WHERE (DKID IN (69954))
ORDER BY case when ImageName1 = 'na' then 0 else 1 end, 
Make , Model, Year DESC

答案 2 :(得分:1)

您正在使用JDBC。可能是JDBC的转换/解释吗?尝试将'na'作为参数。检查JDBC中是否存在查询中字符串常量的特定语法。我不使用JDBC,所以我可能完全错了。

答案 3 :(得分:0)

尝试将case语句括在括号中。

SELECT *
FROM Vehicles
WHERE (DKID IN (69954))
ORDER BY 
    (case when ImageName1 = 'na' then 0 else 1 end), Make , Model, Year DESC

答案 4 :(得分:0)

您的查询在SQL Mgmt Studio中对我来说运行正常...也许尝试这种方式,看看它是否能让您到处:

SELECT
    case when ImageName1 = 'na' then 0 else 1 end as OrderCol,
    *
FROM Vehicles
WHERE (DKID IN (69954))
ORDER BY OrderCol,Make,Model,Year DESC

答案 5 :(得分:0)

正如KMike所说,看起来你没有正确逃脱。

基本上,当您运行语句时,它不会从动态SQL生成语法正确的SQL语句。

通常,当我编写动态sql时,我使用print语句来打印生成的SQL。然后我可以直观地查看生成的sql是否有明显的错误,然后执行它以确保它按预期工作。

如果我在动态SQL中犯了错误,通常会在此处显示。