我使用以下查询来填充值的下拉列表。
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'附近的语法不正确。
此外,此查询正在拉动"空白或空白"值并在下拉列表的顶部显示空格。如果可能的话,我想隐藏它。不显示任何空值?
答案 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