如果我有R11
和R2
之类的内容,我希望R2
小于R11
,但不是:{/ p>
select
case when 'R11' < 'R2'
then 'YES'
else 'NO'
end
如果不是,则生成YES
。
除了制作CLR功能之外,还有更简单的方法吗?
答案 0 :(得分:1)
这就是你要找的东西,把字符串的数字部分排序为int,将字符部分排序为字符。希望这是有帮助的。
注意事项:总长度为5,1个字符[a-z],2-5个字符[0-9]
DECLARE @TestTable TABLE(ID INT IDENTITY(1,1), String VARCHAR(5))
INSERT INTO @TestTable
VALUES('R1'),('R11'),('R12'),('R2'),('R21'),('Q12'),('U2'),('R21')
SELECT
tt.ID,
tt.String
FROM
@TestTable tt
ORDER BY LEFT(tt.String,1),CAST(STUFF(tt.String,1,1,'') AS INT)
答案 1 :(得分:0)
字母数字排序与自然排序不同。如果您想避免使用CLR,并且输入数据始终采用该格式(Rxxx
),那么您只需删除第一个字母并比较两个INT
:
DECLARE @Index1 AS INT
DECLARE @Index2 AS INT
DECLARE @StrIndex1 AS VARCHAR(10)
DECLARE @StrIndex2 AS VARCHAR(10)
SET @StrIndex1 = 'R11'
SET @StrIndex2 = 'R2'
SET @Index1 = CAST(RIGHT(@StrIndex1, LEN(@StrIndex1) - 1) AS INT)
SET @Index1 = CAST(RIGHT(@StrIndex2, LEN(@StrIndex2) - 1) AS INT)
SELECT
CASE when @Index1 < @Index2
THEN 'YES'
ELSE 'NO'
END