后台:我的SQL数据库包含text
类型的列(foo),而不是integer
。在列中,我以text
形式存储整数。
问题:SELECT
包含(在foo列中)的行是否可能大于/小于 n ?
PS :我有充分的理由将它们存储为文本格式。请不要对此发表评论。
更新 :(忘记提及)我将它存储在SQLite3中。</ p>
答案 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之前取出非数字字符。以下是关于如何做类似事情的链接:
您需要对此功能进行的唯一真正修改是更改以下行:
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