Sql Where子句不适用于字母数字值

Sql Where子句不适用于字母数字值,sql,sql-server,nhibernate,Sql,Sql Server,Nhibernate,我有一个问题,当用户为某些行输入条件但结果是错误的时,会得到错误的结果。主要的问题是找出where子句中的“AV99”是更大还是“AV102” CREATE TABLE dbo.Section ( Section varchar(50) NULL ) INSERT INTO dbo.Section (Section.Section) VALUES ('AV01') INSERT INTO dbo.Section (Section.Section) VALUES ('AV02') I

我有一个问题,当用户为某些行输入条件但结果是错误的时,会得到错误的结果。主要的问题是找出where子句中的“AV99”是更大还是“AV102”

CREATE TABLE dbo.Section
(
       Section varchar(50) NULL
)
INSERT INTO dbo.Section (Section.Section) VALUES ('AV01')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV02')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV03')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV04')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV05')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV06')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV07')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV08')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV09')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV10')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV11')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV12')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV13')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV14')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV15')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV16')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV17')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV95')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV96')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV97')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV98')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV99')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV100')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV101')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV201')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV202')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV301')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV401')
INSERT INTO dbo.Section (Section.Section) VALUES ('AV501')

SELECT Section,
       LEFT(Section,PATINDEX('%[0-9]%',Section)-1),
       CONVERT(INT,SUBSTRING(Section,PATINDEX('[0-9]%',Section),LEN(Section)))
FROM dbo.Section
Where  Section between 'AV09' and 'AV99'
ORDER BY LEFT(Section,PATINDEX('%[0-9]%',Section)-1), -- alphabetical sort
         CONVERT(INT,SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section))) -- numerical sort
我得到的结果是

AV09    AV  9
AV10    AV  10
AV11    AV  11
AV12    AV  12
AV13    AV  13
AV14    AV  14
AV15    AV  15
AV16    AV  16
AV17    AV  17
AV95    AV  95
AV96    AV  96
AV97    AV  97
AV98    AV  98
AV99    AV  99
AV100   AV  100
AV101   AV  101
AV201   AV  201
AV202   AV  202
AV301   AV  301
AV401   AV  401
AV501   AV  501
但应该是这样

AV09    AV  9
AV10    AV  10
AV11    AV  11
AV12    AV  12
AV13    AV  13
AV14    AV  14
AV15    AV  15
AV16    AV  16
AV17    AV  17
AV95    AV  95
AV96    AV  96
AV97    AV  97
AV98    AV  98
AV99    AV  99
我是为NHibernate做的,但是如果SQL中有任何简单的解决方案,请让我知道


谢谢

问题在于这一行:

WHERE Section between 'AV09' and 'AV99'
因为像
AV100
这样的值是按字母顺序排列的。您可以按以下方式使用您在订单中拥有的相同代码:

WHERE CONVERT(INT,SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section))) 
    BETWEEN 9 AND 99

你需要做与order by相同的技巧。不仅仅是order by,我检查了排序是否有效,但在哪里不起作用。你必须在比较之前提取整数…代码是字母数字的,所以不知道数字和字符的位置。我也尝试过排序,但不起作用,从数据库中选择Section。Section ORDER BY Section COLLATE Latin1\u General\u BIN ASC您如何知道代码中的数字。它可以是任何东西,因为它是字母数字。它可以是像‘A0B01’、‘00210’、‘ABBAAS’等的组合。