ORDER BY使用UNION&的select语句不同

时间:2016-09-21 20:50:05

标签: sql-server tsql

我使用以下查询来填充值的下拉列表。

select 'Select a City' as City, 'All' as Value
UNION ALL
select distinct City, City as Value from BND_Listing

我想对结果进行A-Z排序。我尝试过以下方法:

select 'Select a City' as City, 'All' as Value
UNION ALL
select distinct City, City as Value from BND_Listing
ORDER BY City ASC

但是我收到了错误:

  

关键字' Union'附近的语法不正确。

此外,此查询正在拉动"空白或空白"值并在下拉列表的顶部显示空格。如果可能的话,我想隐藏它。不显示任何空值?

3 个答案:

答案 0 :(得分:2)

您想在结果中添加一行,该行始终位于顶部并带有NULL作为ID?

试试这个:

SELECT *
FROM
(
    SELECT NULL AS col1,'select an object' AS col2,0 AS SortInx
    UNION ALL
    SELECT TOP 10 object_id,name,ROW_NUMBER() OVER(ORDER BY name)
    FROM sys.objects
) AS Sortable
ORDER BY SortInx

简短说明:ROW_NUMBER()1开头,因此第一行获取0作为排序索引。从1到x的数字代表排序名称的顺序。

外部SELECT将再次对结果集进行排序,确保0在前面,1到x在...

答案 1 :(得分:1)

我同意这里的大多数评论,其中最好的方法是在应用程序本身中添加“Select a Value”行。最好让数据库只向您的应用程序提供“实际”数据,并在代码中处理类似的事情。

我也不确定这个项目的用途,但是如果你有访问权限,我强烈建议在数据库级别创建视图和/或存储过程,以从应用程序中抽象出任何数据库模式和逻辑更改。

出于好奇,你为什么用不同的别名选择两次相同的字段?我假设您在简单的HTML下拉列表中设置显示值和实际值,但在这种情况下,值是相同的,因此您的结果集中只能有一个字段,并且在该结果集中引用该值两次应用。这样做可以解决原始问题的问题,并简化您的查询(尽管查询这个简单的成本可以忽略不计),看起来像这样:

SELECT DISTINCT City
FROM BND_Listing (NOLOCK)
WHERE City IS NOT NULL
ORDER BY 1 ASC

根据数据,数据库配置等,您可能需要使用以下内容来计算空字符串和/或前导/尾随空格:

SELECT DISTINCT LTRIM(RTRIM(City)) AS City
FROM BND_Listing (NOLOCK)
WHERE LTRIM(RTRIM(City)) <> '' 
    AND City IS NOT NULL
ORDER BY 1

抱歉...我知道这可能有点过分,但是你说你是SQL的新手,所以我想我只是分享一下,以防你的NULL结果实际上是空字符串。

答案 2 :(得分:0)

感谢大家的回复,它给了我很多关于在哪里寻找我的问题的见解。添加以下内容的原始查询获得了正确的结果。

工作查询:

select 'Select a City' as City, 'All' as Value
UNION ALL
select distinct City, City as Value from BND_Listing
where isnull(City,'') <> ''
Order by City ASC

“选择城市”始终位于下拉列表的顶部。感谢@scsimon在我的另一篇文章中。

with cte as(
select 'Select a City' as City, 'All' as Value
UNION ALL
select distinct City, City as Value from BND_Listing
where isnull(City,'') <> '')


select * from cte  Order by case when City = 'Select a City' then 1 else 2     end, City ASC