背景:我有一個SQL數據庫,其中包含text
類型的列(foo),而不是integer
。在我存儲整數列text
形式。SQL:SELECT數字文本基於數字
問題:是否有可能SELECT
包含(foo中列)的行數大於/小於ñ較小?
PS:我有一個非常好的理由將它們存儲爲文本形式。請不要對此發表評論。
更新:(忘了提),我將它存儲在sqlite3的。
背景:我有一個SQL數據庫,其中包含text
類型的列(foo),而不是integer
。在我存儲整數列text
形式。SQL:SELECT數字文本基於數字
問題:是否有可能SELECT
包含(foo中列)的行數大於/小於ñ較小?
PS:我有一個非常好的理由將它們存儲爲文本形式。請不要對此發表評論。
更新:(忘了提),我將它存儲在sqlite3的。
SELECT foo
FROM Table
WHERE CAST(foo as int)>@n
如果foo不總是int,那麼這不會拋出錯誤嗎? – IAmTimCorey 2012-04-23 14:53:04
@BiggsTRC這是正確的,但這就是你得到的糟糕的數據庫設計。 – Curt 2012-04-23 15:29:16
適合我,謝謝。 – Byte 2012-04-23 16:27:07
SELECT *
FROM Table
WHERE CAST(foo as int) > 2000
select *
from tableName
where cast(textColumn as int) > 5
你距離正確的第一響應者晚了約20秒,對此抱歉。我會給你+1努力和正確的答案。 – Byte 2012-04-23 16:27:51
在一個簡單的CAST WHERE子句會,只要你相信,在foo的列中的數據是要正確地轉換爲整數工作。如果不是,你的SELECT語句會拋出一個錯誤。我建議你在這裏添加一個額外的步驟,並在將該字段轉換爲int之前取出非數字字符。下面是關於如何做類似的鏈接:
唯一真正的改變,你需要對這個功能做的是改變以下行:
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表示的額外列。這有點危險,因爲您需要保持兩個字段同步,但它可以讓您快速排序和過濾表格數據。
+1用於考慮非數字值 – Curt 2012-04-23 15:30:36
感謝您提供有用的信息。看起來好像我的程序在執行'cast'時沒有出現故障,即使某些行包含'N/A'也是如此。所以給你+1,但我必須把複選標記給第一個正確的響應者。再次感謝。 – Byte 2012-04-23 16:26:34
@Byte - 很高興知道。然而,我會小心你的期望。例如,你想讓「n/a」行顯示嗎?如果是這樣,是嗎?如果您的過濾器顯示「<5」,是否包含「n/a」記錄?仔細檢查一下,看看這些行發生了什麼,並找出這是否是你所期望的。否則,您可能會發現您的號碼已關閉。例如,如果您對這些「> = 5」進行了計數,將另一個計數爲「<5」並將這兩個數字相加,則您可能無法獲得記錄的總數(這可能是對還是錯,取決於你的用例 – IAmTimCorey 2012-04-23 16:51:15
你正在存儲哪種數據庫類型? MS-SQL?恕我直言,雖然你可能有充分的理由作爲文本存儲,我不懷疑你這樣做,分享它可能是你存儲它在文本中的原因可以做不同,並使查詢更容易。 – BugFinder 2012-04-23 14:51:02
@BugFinder感謝您的關注,我已經得到了正確的答案。 – Byte 2012-04-23 16:32:46
那好吧,當我發佈時,你沒有答案:) – BugFinder 2012-04-23 22:34:33