按整数排序,底部有空白字段

时间:2009-06-03 13:06:04

标签: sql sql-server sql-server-2008

我们目前正在重写我们的CMS,我们希望我们的客户能够使用“位置”字段重新订购表格中的项目。因此,如果他们将项目标记为位置1,则将其标记为顶部,然后将位置2标记在其下方等。

问题是我们不希望他们每次都要填写一个位置,只要他们想重新订购某些东西,所以位置字段通常是空白的。所以你可能有以下......

车 - 1

自行车 - 2

计算机

这会导致问题,因为如果您使用以下SQL ...

SELECT ProductName FROM Products ORDER BY Position DESC;

所有空白的都是顶部,而不是底部。

使用SQL语句可以将它们置于正确的顺序吗?

4 个答案:

答案 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”行默认为整数最大值,您可以轻松地消除空值的使用以及由此产生的排序问题:

  • 更新产品SET位置= 2147483647 WHERE位置IS NULL
  • 将列设置为NOT NULL,添加默认值2147483647
  • 按预期使用您的ORDER BY
  • 在您的应用或加载查询中,禁止显示任何值2147483647

这是一个示例加载:

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)