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)
您可以像在应用程序层中一样轻松地在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)