0

背景:我有一个 SQL 数据库,其中包含一个text类型的列 (foo) 而不是integer。在列中,我以表格形式存储整数text

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

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


更新:(忘了提)我将它存储在 SQLite3 中。

4

4 回答 4

4
SELECT foo
FROM Table
WHERE CAST(foo as int)>@n
于 2012-04-23T14:50:19.227 回答
3
select *
from   tableName
where  cast(textColumn as int) > 5
于 2012-04-23T14:50:21.163 回答
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 表示形式。这有点危险,因为您需要保持两个字段同步,但它可以让您快速排序和过滤表数据。

于 2012-04-23T14:58:33.240 回答
1
SELECT *
  FROM Table
    WHERE CAST(foo as int) > 2000
于 2012-04-23T14:50:11.773 回答