Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在数字比较中使用SQL中字符串中的数据?_Sql_Sql Server_Casting - Fatal编程技术网

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

如何在数字比较中使用SQL中字符串中的数据?,sql,sql-server,casting,Sql,Sql Server,Casting,我是一个B级SQL用户,所以请容忍我。我有一个NVARCHAR格式的字段(“年份”),但几乎每1000条记录中只有1条不是数字。是的,这是一种荒谬的方法,但是我们从客户那里收到了这个数据库,我们无法更改它。 我想从数据库中提取年份字段大于某个值(例如,2006年或更高)的记录。我可以忽略任何年份与实际年份不符的记录。我们正在使用SQL server 2014。 我创建了一个嵌入式查询来将数据转换为一个“float”字段,但无论出于什么原因,我都不能在这个新的浮点字段中添加where子句。我最初尝

我是一个B级SQL用户,所以请容忍我。我有一个NVARCHAR格式的字段(“年份”),但几乎每1000条记录中只有1条不是数字。是的,这是一种荒谬的方法,但是我们从客户那里收到了这个数据库,我们无法更改它。 我想从数据库中提取年份字段大于某个值(例如,2006年或更高)的记录。我可以忽略任何年份与实际年份不符的记录。我们正在使用SQL server 2014。 我创建了一个嵌入式查询来将数据转换为一个“float”字段,但无论出于什么原因,我都不能在这个新的浮点字段中添加where子句。我最初尝试使用“case if”,但得到了相同的结果。 我很紧张,因为我要么错过了一些非常愚蠢的东西,要么SQL server中有一个bug。当我看到小提示中的字段时,它显示为一个浮点数。当我运行这个程序时,我得到“将数据类型nvarchar转换为float时出错”

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

 where VL.FLYear like '%2006%'

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

尝试使用Cast。使用下面的链接查看有关铸造的更多详细信息


尝试简化它,只需使用Try\u CONVERT(DATETIME,aYearvalue)或Try\u PARSE,它将为无法转换的值返回NULL,并继续处理有效行。我认为您可以取消where子句作为join,直接对列进行操作,如:(用列替换datetime之后的文字字符串)

设置日期格式mdy

选择年份(尝试转换(日期时间,'08/01/2017'))作为值1
其中值1>=2016

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

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
有关强制转换和转换文档,请查看以下链接:

注意:ISNUMERIC将返回true(对于具有科学数值的值,例如1E10,为假阳性,尽管我从您的数据中看不到这种情况)

另一个选项是TRY_CONVERT

关于TRY_CONVERT的文档:


此处不接受仅包含场外内容链接的答案。如果您想将此作为答案发布,请在此处总结场外内容,然后提供链接作为附加参考。如果非现场链接在将来由于某种原因不可用,答案应该是独立的。这并不一定会改变问题,但为什么不转换为int而不是float呢?如果该值是“年”值,为什么需要十进制?Robert,数据库中的记录包含一个小数点。例如,“2008.00”。我觉得把它们转换成浮点数比较容易。编辑你的问题并展示数值的样本。Eli,这不起作用。您提供的代码和TRY_CONVERT函数都不起作用。正如我所说的,我开始认为SQL Server 2014中存在一个bug。您能在SQLFiddle或rextester中重新创建它并在这里共享吗?
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