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

时间:2015-09-11 13:56:54

标签: sql sql-server nhibernate

我遇到问题,当用户输入某些行的条件但结果错误时会得到错误的结果。主要问题是找到' AV99'是更大或AV102'在where子句中。

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中有任何简单的解决方案那么请告诉我。

由于

1 个答案:

答案 0 :(得分:2)

问题在于这一行:

WHERE Section between 'AV09' and 'AV99'

因为AV100之类的值在字母之间是 。您可以使用ORDER BY中的相同代码,如下所示:

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