我遇到问题,当用户输入某些行的条件但结果错误时会得到错误的结果。主要问题是找到' 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中有任何简单的解决方案那么请告诉我。
由于
答案 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