SQL:基于数字的SELECT数字文本

时间:2012-04-23 14:48:33

标签: sql select text integer

后台:我的SQL数据库包含text类型的列(foo),而不是integer。在列中,我以text形式存储整数

问题SELECT包含(在foo列中)的行是否可能大于/小于 n

PS :我有充分的理由将它们存储为文本格式。请不要对此发表评论。


更新 :(忘记提及)我将它存储在SQLite3中。<​​/ p>

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

select *
from   tableName
where  cast(textColumn as int) > 5

答案 2 :(得分:2)

只要您确定foo列中的数据将正确转换为整数,WHERE子句中的简单CAST就会起作用。如果没有,您的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表示的额外列。由于您需要保持两个字段同步,因此它会更加危险,但它可以让您快速对表格数据进行排序和过滤。

答案 3 :(得分:1)

SELECT *
  FROM Table
    WHERE CAST(foo as int) > 2000