字符串列数据的数字比较

时间:2009-07-18 07:21:51

标签: 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

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

6 个答案:

答案 0 :(得分:8)

如果您无法更改列类型,则必须先使用CAST or CONVERT进行比较。你的代码是:

SELECT EmpId, FirstName, TotalExp
FROM sample
WHERE CAST(TotalExp AS INT) > 6

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

答案 1 :(得分:5)

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

where totalexp  > '6'

? 6年,6个月,65天?

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

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

因此,对于主动技能,最好有一个ExperienceSince DATETIME字段,其效果很好,因此其“总体验”始终是最新的。

答案 2 :(得分:3)

我的主要建议是执行数据清理练习以标准化列数据。目前,单个列中有多种形式/标准的数据。


但是,如果您希望完全忽略字符数据,那么为了考虑不会自然转换为整数的列值,您可以使用isnumeric()函数来测试列数据是否为数字。

有关详细信息,请参阅以下示例:

create table #testTable
(
    NumericAsString nvarchar(100)
);

insert into #testTable (NumericAsString) values('1');
insert into #testTable (NumericAsString) values('4');
insert into #testTable (NumericAsString) values('28');
insert into #testTable (NumericAsString) values('32');
insert into #testTable (NumericAsString) values('11232');
insert into #testTable (NumericAsString) values('fdsfdfas');
insert into #testTable (NumericAsString) values('wtwtrwtw');

select * 
from #testTable; 

select NumericAsString
from #testTable
where 
    (
    case 
        when isnumeric(NumericAsString) = 1 then convert(int, NumericAsString)
        else 0
    end)
    > 6 

drop table #testTable;

答案 3 :(得分:3)

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

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

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

代码经过测试

答案 4 :(得分:2)

或许'totalexp'需要是一个数字字段(int等)而不是nvarchar,以便在where子句中进行比较。使用nvarchar存储数字不是一个好主意。

答案 5 :(得分:2)

尝试在where子句上使用Cast or Convert将totalexp的类型更改为整数。

SELECT EmpId,FirstName,totalexp
 FROM sample
 WHERE  CONVERT(int ,totalexp) > 6