2013-10-11 72 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'無關':) –

相關問題