2012-04-23 43 views
0

背景:我有一個SQL數據庫,其中包含text類型的列(foo),而不是integer。在我存儲整數text形式。SQL:SELECT數字文本基於數字

問題:是否有可能SELECT包含(foo中列)的行數大於/小於ñ較小?

PS:我有一個非常好的理由將它們存儲爲文本形式。請不要對此發表評論。


更新:(忘了提),我將它存儲在sqlite3的。

+0

你正在存儲哪種數據庫類型? MS-SQL?恕我直言,雖然你可能有充分的理由作爲文本存儲,我不懷疑你這樣做,分享它可能是你存儲它在文本中的原因可以做不同,並使查詢更容易。 – BugFinder 2012-04-23 14:51:02

+0

@BugFinder感謝您的關注,我已經得到了正確的答案。 – Byte 2012-04-23 16:32:46

+1

那好吧,當我發佈時,你沒有答案:) – BugFinder 2012-04-23 22:34:33

回答

4
SELECT foo 
FROM Table 
WHERE CAST(foo as int)>@n 
+0

如果foo不總是int,那麼這不會拋出錯誤嗎? – IAmTimCorey 2012-04-23 14:53:04

+0

@BiggsTRC這是正確的,但這就是你得到的糟糕的數據庫設計。 – Curt 2012-04-23 15:29:16

+0

適合我,謝謝。 – Byte 2012-04-23 16:27:07

1
SELECT * 
    FROM Table 
    WHERE CAST(foo as int) > 2000 
3
select * 
from tableName 
where cast(textColumn as int) > 5 
+0

你距離正確的第一響應者晚了約20秒,對此抱歉。我會給你+1努力和正確的答案。 – Byte 2012-04-23 16:27:51

2

在一個簡單的CAST WHERE子句會,只要你相信,在foo的列中的數據是要正確地轉換爲整數工作。如果不是,你的SELECT語句會拋出一個錯誤。我建議你在這裏添加一個額外的步驟,並在將該字段轉換爲int之前取出非數字字符。下面是關於如何做類似的鏈接:

http://blog.sqlauthority.com/2007/05/13/sql-server-udf-function-to-parse-alphanumeric-characters-from-string/

唯一真正的改變,你需要對這個功能做的是改變以下行:

PATINDEX('%[^0-9A-Za-z]%', @string) 

PATINDEX('%[^0-9]%', @string) 

該UDF的結果應該可轉換爲int而不會引發錯誤。它會進一步減慢你的查詢速度,但它會更安全。你甚至可以把你的CAST放在UDF中,並且只需要一個電話。最後UDF應該是這樣的:

CREATE FUNCTION dbo.UDF_ParseAlphaChars 
(
@string VARCHAR(8000) 
) 
RETURNS int 
AS 
BEGIN 
DECLARE @IncorrectCharLoc SMALLINT 
SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string) 
WHILE @IncorrectCharLoc > 0 
BEGIN 
SET @string = STUFF(@string, @IncorrectCharLoc, 1, '') 
SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string) 
END 
SET @string = @string 
RETURN CAST(@string as int) 
END 
GO 

你最後的SELECT語句將是這個樣子:

SELECT * 
FROM Table 
WHERE UDF_ParseAlphaChars(Foo) > 5 

編輯

基於新的信息數據庫SQLite的,上述可能不會直接工作。我不相信SQLite對UDF有本地支持。您可以使用您選擇的編程語言創建一種類型的UDF(如下所示:http://www.christian-etter.de/?p=439

我看到的其他選項可以安全地獲取所有數據(IsNumeric將從結果中排除某些行,可能不是你想要的)可能會創建一個具有字符串的int表示的額外列。這有點危險,因爲您需要保持兩個字段同步,但它可以讓您快速排序和過濾表格數據。

+0

+1用於考慮非數字值 – Curt 2012-04-23 15:30:36

+0

感謝您提供有用的信息。看起來好像我的程序在執行'cast'時沒有出現故障,即使某些行包含'N/A'也是如此。所以給你+1,但我必須把複選標記給第一個正確的響應者。再次感謝。 – Byte 2012-04-23 16:26:34

+0

@Byte - 很高興知道。然而,我會小心你的期望。例如,你想讓「n/a」行顯示嗎?如果是這樣,是嗎?如果您的過濾器顯示「<5」,是否包含「n/a」記錄?仔細檢查一下,看看這些行發生了什麼,並找出這是否是你所期望的。否則,您可能會發現您的號碼已關閉。例如,如果您對這些「> = 5」進行了計數,將另一個計數爲「<5」並將這兩個數字相加,則您可能無法獲得記錄的總數(這可能是對還是錯,取決於你的用例 – IAmTimCorey 2012-04-23 16:51:15