【问题标题】:SQL: SELECT number text base on a numberSQL:基于数字选择数字文本
【发布时间】:2012-04-23 14:48:32
【问题描述】:

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

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

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


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

【问题讨论】:

  • 您将其存储在哪种数据库类型中?微软 SQL?恕我直言,虽然您可能有充分的理由将其存储为文本,而且我不怀疑您这样做,但分享一下您将其存储为文本的原因可能会有所不同,并使查询更容易。
  • @BugFinder 谢谢你的关心,我已经得到了正确答案。
  • 没关系,我发帖时你没有答案 :)

标签: sql select text integer


【解决方案1】:
SELECT foo
FROM Table
WHERE CAST(foo as int)>@n

【讨论】:

  • @BiggsTRC 没错,但这就是糟糕的数据库设计所得到的结果。
【解决方案2】:
select *
from   tableName
where  cast(textColumn as int) > 5

【讨论】:

  • 您比正确的第一响应者晚了大约 20 秒,很抱歉。我会为你的努力和正确答案 +1。
【解决方案3】:

只要您确定 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 表示.这有点危险,因为您需要保持两个字段同步,但它可以让您快速排序和过滤表数据。

【讨论】:

  • 感谢您提供有用的信息。似乎我的程序在执行cast 时运行没有故障,即使某些行包含“N/A”。所以+1给你,但我必须给第一个正确的响应者打勾。再次感谢。
  • @Byte - 很高兴知道。然而,我会小心你的期望。例如,您是否希望显示“n/a”行?如果是这样,是吗?如果您的过滤器显示“=5”和另一个“
  • 是的,我已经考虑过它们,这是我的代码中的样子:AND (NOT CAST(numberText as int) <= '5' OR numberText = 'N/A') 排除低于 5 的那些,但包括那些 N/A。我在 Objective-C 中将这些与使用 libsqlite3.dylib 的 iOS 应用程序一起使用。它可能在其他地方不起作用,但在这种情况下它确实有效。但是如果没有你的回答,我会完全忘记N/A,所以,我感谢你。
  • @Byte 太好了。很高兴听到它有效,并且您不会在不合时宜的时间对结果感到惊讶。 :-)
【解决方案4】:
SELECT *
  FROM Table
    WHERE CAST(foo as int) > 2000

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2021-11-23
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多