字符串列数据的数字比较

7 sql-server

我需要一个帮助n查询

"totalexp"是一个nvarchar字段......在表格中我需要选择如下所示

select EmpId,FirstName,totalexp from sample where totalexp  > '6'

empid   firstname      totalexp
1       Me              8.2
5       as              6
10      567             64 mon
11      leader          6+ yrs
12      admintest       6.3
16      G               6
Run Code Online (Sandbox Code Playgroud)

我有11,12,21等值,所有这些都没有显示那些东西

Adr*_*ong 9

如果无法更改列类型,则必须在执行比较之前使用CAST或CONVERT.你的代码是:

SELECT EmpId, FirstName, TotalExp
FROM sample
WHERE CAST(TotalExp AS INT) > 6
Run Code Online (Sandbox Code Playgroud)

一点警告:对于您当前的数据库结构,任何人都可以将TotalExp作为"一个"或"两个"或任何其他任意字符串插入,您的查询将失败.真的不是你想要发生的事情.


小智 6

我知道这个问题很老了。只是发布答案,因为它可能对某些人有帮助。

以下代码可用于其他行存在非数值的场景。

SELECT EmpId,FirstName,totalexp
 FROM sample
WHERE
 (CASE 
WHEN (ISNUMERIC(totalexp) = 1)
THEN CAST(LTRIM(RTRIM(totalexp)) AS float)
ELSE 0 END) > 6
Run Code Online (Sandbox Code Playgroud)

代码已测试工作

  • 我可能是错的,但我觉得“ELSE 0”(最后一行)与零相比可能会导致错误的结果。也许您应该改用“ELSE NULL”。 (3认同)

dev*_*vio 5

混乱开始于TotalExp为nvarchar,因为它包含的数据可能是"6个月","6年","6 + yrs"等.背后的意图是什么

where totalexp  > '6'
Run Code Online (Sandbox Code Playgroud)

?6年,6个月,65天?

您需要将数据转换为数字格式,例如可以与某些要求进行比较的数月(作为"月经验").

但是,在一年内,您的数据将变得过时,因为它不会改变,因为除了现在表示"6年"的每个TotalExp应该是"7年"(如果在此期间已经实施该技能)之外.

因此,对于主动技能,最好有一个ExperienceSince DATETIME字段,它具有良好的效果,其产生的"总体验"始终是最新的.


And*_*ewS 2

也许“totalexp”需要是数字字段(int 等)而不是 nvarchar 才能在 where 子句中进行比较。使用 nvarchar 来存储数字不是一个好主意。