如何比较SQL Server 2008 R2中的两个字符串

时间:2014-08-01 19:53:21

标签: sql-server tsql sql-server-2008-r2

如果我有R11R2之类的内容,我希望R2小于R11,但不是:{/ p>

select 
    case when 'R11' < 'R2'
      then 'YES'
      else 'NO'
    end

如果不是,则生成YES

除了制作CLR功能之外,还有更简单的方法吗?

2 个答案:

答案 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