2013-10-11 34 views
3

我的数据库表中有一个字母数字列。对于我的过滤器,我正在使用它们来获取结果过滤器的值。一切正常。但是,在某些情况下,它会忽略一些来自过滤的数据。这是我的样品,SQL之间的字母数字值

样本数据

ACQPO14 
002421 
ACQPO8 
ACQPO14 
ACQPO19 
DUMMY0001 

SQL查询

SELECT po.No, 
    po.PoS 
FROM PoDetails pod 
INNER JOIN Pors po ON po.Id=PoD.PoId 
WHERE po.No BETWEEN 'ACQPO1' AND 'ACQPO20' 

对于上述样品。查询仅返回ACQPO14ACQPO19ACQPO8

对此问题的任何帮助将不胜感激。

谢谢

+0

“ACQP”是固定的或后面的任何逻辑.. – bgs

+0

是的,它是固定的... – DonMax

+0

@Deva解决方案的语法将取决于DBMS。你在用什么MySQL? –

回答

1

它是有道理的,因为它只是文本。

1到来之前8所以,在文本排序(从左至右)的分贝会不顾ACQPO14最后一个数字比较它反对ACQPO8。因此ACQPO14删除)出现在ACQPO8ACQPO20删除)之前也出现在ACQPO8之前。所以它被between过滤掉了。

解决这个问题的唯一方法是通过分解列来解析列。 EG:如果ACQPO是一个固定长度的前缀,您可以使用某些DBMS功能(您没有指定任何)来修剪该部分,并将其转换为数字格式。然后比较/过滤剩余的数字。

0

这是你会怎么做这Oracle

SELECT po.No, po.PoS 
FROM PoDetails pod 
INNER JOIN Pors po ON po.Id=PoD.PoId 
WHERE SUBSTR(po.No, 1, 5) = 'ACPQO' 
AND TO_NUMBER(SUBSTR(po.No, 6, 2)) >= 1 
AND TO_NUMBER(SUBSTR(po.No, 6, 2)) <= 20; 

首先SUBSTR()用于值的文字部分匹配。然后使用TO_NUMBER()将值的数字部分解析为数字,并将其用于120之间的数字比较。 (其他数据库也将有类似的功能做同样的。)

0

如果ACQPO固定,然后尝试在SQL Server下面

SELECT po.No, po.PoS 
FROM PoDetails pod 
INNER JOIN Pors po ON po.Id=PoD.PoId 
WHERE left(po.No,5) and 
cast(substring(po.No,6,len(po.No)) as int) 
BETWEEN cast(substring('ACQPO1',6,len(po.No)) as int) AND cast(substring('ACQPO20',6,len(po.No)) as int) 


SELECT substring(data,6,len(data)),* FROM #Temp Where 
left(data,5) ='ACQPO' And 
cast(substring(data,6,len(data)) as int) 
BETWEEN cast(substring('ACQPO1',6,len(data)) as int) AND cast(substring('ACQPO20',6,len(data)) as int) 
+0

你应该澄清这个应该工作的DBMS。看起来像SQL Server –

+0

@MostyMostacho是的,用户用SQL来推导这个问题 – bgs

+0

'结构化查询语言'与'SQL Server'无关':) –

相关问题