Sql Where子句不适用于字母数字值
我有一个问题,当用户为某些行输入条件但结果是错误的时,会得到错误的结果。主要的问题是找出where子句中的“AV99”是更大还是“AV102”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
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’等的组合。