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