我们目前正在重写我们的CMS,我们希望我们的客户能够使用“位置”字段重新订购表格中的项目。因此,如果他们将项目标记为位置1,则将其标记为顶部,然后将位置2标记在其下方等。
问题是我们不希望他们每次都要填写一个位置,只要他们想重新订购某些东西,所以位置字段通常是空白的。所以你可能有以下......
车 - 1
自行车 - 2
楼
计算机
狗
这会导致问题,因为如果您使用以下SQL ...
SELECT ProductName FROM Products ORDER BY Position DESC;
所有空白的都是顶部,而不是底部。
使用SQL语句可以将它们置于正确的顺序吗?
答案 0 :(得分:15)
SELECT ProductName
FROM Products
ORDER BY
CASE WHEN Position is null THEN 1 ELSE 0 END,
Position
如果您想按位置降序排序,同时在底部保留空值,则可以执行此操作:
ORDER BY
CASE WHEN Position is null THEN 1 ELSE 0 END,
Position desc
如果您想要一致排序(可能是分页),那么最后添加ProductName或ProductID以打破未定位产品之间的所有联系。
ORDER BY
CASE WHEN Position is null THEN 1 ELSE 0 END,
Position,
ProductID
答案 1 :(得分:2)
SELECT ProductName
FROM Products
ORDER BY
COALESCE(position, (SELECT MAX(position) + 1 FROM Products))
或者,您可以使用:
SELECT *
FROM (
SELECT ProductName
FROM Products
WHERE position IS NOT NULL
ORDER BY
position
) q
UNION ALL
SELECT ProductName
FROM Products
WHERE position IS NULL
这样会更有效率,因为第一个子查询将使用position
上的索引进行排序是否存在。
答案 2 :(得分:0)
这应该为你完成这项工作。
CREATE TABLE [dbo].[Test](
[Position] [int] NULL,
[Title] [varchar](15) NULL
)
GO
INSERT INTO Test Values(1, 'P1')
INSERT INTO Test Values(2, 'P2')
INSERT INTO Test Values(NULL, 'P3')
INSERT INTO Test Values(NULL, 'P4')
INSERT INTO Test Values(NULL, 'P5')
GO
SELECT Title + ' - ' + CASE
WHEN POSITION IS NULL THEN ''
ELSE CAST(Position AS CHAR(3))
END
FROM Test
ORDER BY CASE WHEN Position is null THEN 1 ELSE 0 END
答案 3 :(得分:0)
仅在必要时使用NULL
通过将“unset”行默认为整数最大值,您可以轻松地消除空值的使用以及由此产生的排序问题:
这是一个示例加载:
SELECT
ProductName
,CASE
WHEN Position=2147483647 THEN NULL --or cast this as a varchar and use 'N/A'
ELSE Position
END
FROM ...
如果必须使用空值,请按以下方式执行:
SELECT
ProductName
,Position
FROM Test
ORDER BY COALESCE(Position,2147483647)