如何在SQL中创建序数(即"1st""2nd"等)

TPh*_*Phe 12 sql t-sql sql-server

我最近在SSRS-2008标签中回答了这个问题,该标签要求将日期中的日期编号更改为序数(即"1st","2nd"而不是"1","2").该解决方案涉及VB.Net功能.我很好奇如何在SQL中执行此任务(特别是t-sql和SQL Server),或者是否有一些内置支持.

所以这是一个场景:假设你已经为1000名参赛者组织了一个足球赛,并将结果放在一个包含名称和地点(正常数字)列的表格中.您想要创建一个查询,该查询将显示用户的名称及其在序号中的位置.

Ste*_*han 17

这是一个适用于任何数字的可扩展解决方案.我认为其他人使用%100表示​​11,12,13,但我错了.

WITH CTE_Numbers
AS
(
    SELECT 1 num
    UNION ALL
    SELECT num + 1
    FROM CTE_Numbers
    WHERE num < 1000
)

SELECT  CAST(num AS VARCHAR(10))
        +
        CASE
            WHEN num % 100 IN (11,12,13) THEN 'th' --first checks for exception
            WHEN num % 10 = 1 THEN 'st'
            WHEN num % 10 = 2 THEN 'nd'
            WHEN num % 10 = 3 THEN 'rd'
            ELSE 'th' --works for num % 10 IN (4,5,6,7,8,9,0)
        END
FROM CTE_Numbers
OPTION (MAXRECURSION 0)
Run Code Online (Sandbox Code Playgroud)

  • 我碰巧看到了这个帖子。我不想将此作为解决方案发布,因为它与这个完全相同,我只是碰巧使用在提供此解决方案时不可用的功能以不同的方式编写它,我是一个超级粉丝一个班轮大声笑: IIF(num % 100 IN (11,12,13)​​, 'th', COALESCE(CHOOSE(num % 10,'st','nd','rd'),'th')) (2认同)

Dav*_*ugg 9

您可以像在应用程序层中一样轻松地在SQL中执行此操作:

DECLARE @myDate DATETIME = '2015-05-21';
DECLARE @day INT;
SELECT  @day = DAY(@myDate);
SELECT  CASE WHEN @day IN ( 11, 12, 13 ) THEN CAST(@day AS VARCHAR(10)) + 'th'
             WHEN @day % 10 = 1 THEN CAST(@day AS VARCHAR(10)) + 'st'
             WHEN @day % 10 = 2 THEN CAST(@day AS VARCHAR(10)) + 'nd'
             WHEN @day % 10 = 3 THEN CAST(@day AS VARCHAR(10)) + 'rd'
             ELSE CAST(@day AS VARCHAR(10)) + 'th'
        END
Run Code Online (Sandbox Code Playgroud)

如有必要,您还可以将其置于标量函数中.

编辑

对于你的例子,它将是:

SELECT  Name ,
        CASE WHEN Place IN ( 11, 12, 13 )
             THEN CAST(Place AS VARCHAR(10)) + 'th'
             WHEN Place % 10 = 1 THEN CAST(Place AS VARCHAR(10)) + 'st'
             WHEN Place % 10 = 2 THEN CAST(Place AS VARCHAR(10)) + 'nd'
             WHEN Place % 10 = 3 THEN CAST(Place AS VARCHAR(10)) + 'rd'
             ELSE CAST(Place AS VARCHAR(10)) + 'th'
        END AS Place
FROM    FootRaceResults;
Run Code Online (Sandbox Code Playgroud)