如何在数字比较中使用SQL中字符串中的数据?

时间:2017-08-16 18:08:17

标签: sql sql-server casting

我是B级SQL用户,请耐心等待。我有一个NVARCHAR格式的字段(“年”),但1000个记录中只有大约1个字段不是数字。是的,这是一种荒谬的方式,但我们从客户那里收到这个数据库,我们无法改变它。 我想从数据库中提取年份字段大于某些内容(例如,2006或更高版本)的记录。我可以忽略那些年份没有评估到实际年份的记录。我们正在使用SQL Server 2014。 我创建了一个嵌入式查询来将数据转换为“float”字段,但无论出于何种原因,我都无法使用这个新的浮点字段添加where子句。我最初尝试使用“case-if”但我得到了相同的结果。 我正在把头发拉出来,因为我要么缺少一些非常愚蠢的东西,要么SQL服务器中有一个错误。当我看到小提示中的字段时,它显示为浮动。当我运行它时,我得到“将数据类型nvarchar转换为浮动时出错。”

SELECT VL.Field_A,
  VL.FLYear,
  VL.Field_B
  FROM
    (select
        Field_A,
        cast ([Year] as float) as FLYear,
        /* didn't work either*/
        /*Convert(float, [Year]) as FLYear, */
        Field_B
    from CustomerProvidedDatabaseTable
        where (Field_A like 'E-%' OR
            Field_A  like 'F-%')
        and
            (isnumeric(year)=1)
        and
            year is not null
            ) VL
        /* this statement is the one it chokes on */
    where
        VL.FLYear >= 2006.0

如果我删除最后一个“where”子句,它工作正常,该字段看起来像一个数字。如果我将最后一个where子句更改为:

 where VL.FLYear like '%2006%'

SQL Server接受它,但它当然不会返回我想要的所有记录。

3 个答案:

答案 0 :(得分:0)

尝试简化它并只使用TRY_CONVERT(DATETIME,aYearvalue)或TRY_PARSE,它将为它无法转换并继续处理有效行的值返回NULL。我认为你可以将where子句作为连接取消,并直接对列进行操作,如:(在日期时间后用字符替换文字字符串)

SET DATEFORMAT mdy;

选择年份(try_convert(datetime,' 08/01 / 2017'))作为value1 WHERE value1> = 2016;

答案 1 :(得分:0)

尝试转换/转换为数字数据类型。我已经修改了查询的最后一行来做到这一点。看一眼。

SELECT 
  VL.Field_A,
  VL.FLYear,
  VL.Field_B
  FROM
    (select
        Field_A,
        cast ([Year] as float) as FLYear,
        /* didn't work either*/
        /*Convert(float, [Year]) as FLYear, */
        Field_B
    from CustomerProvidedDatabaseTable
        where (Field_A like 'E-%' OR
            Field_A  like 'F-%')
        and
            (isnumeric(year)=1)
        and
            year is not null
            ) VL
        /* this statement is the one it chokes on */
    where
        ISNUMERIC(VL.FLYear) = 1
    and 
        CAST(VL.FLYear AS INT) >= 2006
  

查看以下链接以获取演员和转换文档:   https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

注意:ISNUMERIC将返回true(具有科学数值的值的误报,例如1E10,但我不会从您的数据中看到这种情况)。

另一个选项是TRY_CONVERT。

  

关于TRY_CONVERT的文档:https://docs.microsoft.com/en-us/sql/t-sql/functions/try-convert-transact-sql

答案 2 :(得分:-3)

尝试使用投射。使用以下链接查看有关投射的更多细节。

https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql