ORDER BY SELECT 语句使用 UNION & DISTINCT



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

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'附近语法错误。

此外,该查询正在提取"Blank or NULL"值,并在下拉列表的顶部显示空白。如果可能的话,我想隐藏这一点。不显示任何空值?

您想添加一行到您的结果,它总是在顶部并携带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在后面…

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

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

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

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

根据数据,DB配置等,您可能需要考虑空字符串和/或前导/尾随空格,如下所示:

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结果实际上是空字符串。

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

工作查询:

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

, 'Select a City'总是在下拉菜单的顶部。感谢@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

最新更新