SQL Server中varchar字段的数字比较

时间:2009-10-16 07:08:13

标签: sql-server

我想编写一个查询来查看某个类别字段是否在某个范围内。问题是该字段可以包含以“#”字符为前缀的空值,文本或数字文本。

是否有人知道SQL将剥离非数字并允许我进行以下检查。

类别> 1和类别< 100

以下是字段类别可包含的内容示例:

#230.1
#200
Null
text

我正在使用SQL Server 2000

2 个答案:

答案 0 :(得分:2)

我看起来旁观者的解决方案是有效的。你应该考虑几点:

  • 如果表中包含的行数超过几千行,并且要经常运行此类查询,则引入新列来保存类别的数值可能是有益的(如果可用,否则为null) 。这样做会更有效率有两个原因:编写时,SQL需要完全扫描表,即需要检查每一行;它还需要执行所有这些有点昂贵的CPU转换。
  • 您可以考虑引入一些额外的逻辑来规范化类别字段。例如,要删除常见的前导或尾随字符等。这将“拯救”几个类别代码,否则将转换为null将无法参与这些过滤器。

答案 1 :(得分:0)

尝试这样的事情

DECLARE @Table TABLE(
        Val VARCHAR(200)
)

INSERT INTO @Table (Val) SELECT '#230.1'
INSERT INTO @Table (Val) SELECT '#200'
INSERT INTO @Table (Val) SELECT '210'
INSERT INTO @Table (Val) SELECT NULL
INSERT INTO @Table (Val) SELECT 'text'

SELECT  *
FROM    (
            SELECT  CASE
                        WHEN  ISNUMERIC(Val) = 1
                            THEN CAST(Val AS FLOAT)
                        WHEN LEN(Val) > 1 AND   ISNUMERIC(RIGHT(Val,LEN(Val)-1)) = 1
                            THEN CAST(RIGHT(Val,LEN(Val)-1) AS FLOAT)
                    END Num
            FROM    @Table
            WHERE   Val IS NOT NULL
            AND     (
                            ISNUMERIC(Val) = 1
                        OR  (
                                    LEN(Val) > 1
                                AND ISNUMERIC(RIGHT(Val,LEN(Val)-1)) = 1
                            )
                    )
        ) Numbers
WHERE   Num BETWEEN 205 AND 230