背景:我有一个 SQL 数据库,其中包含一个text
类型的列 (foo) 而不是integer
。在列中,我以表格形式存储整数text
。
问题:是否可能SELECT
包含(在 foo 列中)数字大于/小于n的行?
PS:我有充分的理由将它们存储为文本形式。请不要对此发表评论。
更新:(忘了提)我将它存储在 SQLite3 中。
SELECT foo
FROM Table
WHERE CAST(foo as int)>@n
select *
from tableName
where cast(textColumn as int) > 5
只要您确定 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 表示形式。这有点危险,因为您需要保持两个字段同步,但它可以让您快速排序和过滤表数据。
SELECT *
FROM Table
WHERE CAST(foo as int) > 2000