我需要一个帮助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这样的值,所有这些都没有显示那些东西
答案 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