首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQL:当某些条目是文本时如何将varchar转换为数字

TSQL:当某些条目是文本时如何将varchar转换为数字
EN

Stack Overflow用户
提问于 2014-07-21 15:27:22
回答 3查看 717关注 0票数 0

假设我有一个有两个相关列的表:一个主键和一个and。“金额”代表货币,是两件事之一:一个数字值(例如,47.50)或“未清”一词。

我想在这个数据集上使用聚合函数。当标准不返回任何带有“未清”金额的记录时,以下内容工作得很好:

代码语言:javascript
复制
select count(primary_key), sum(cast(amount as numeric)
from (table)
where (criteria)

但是,如果(条件)返回“未清”的任何记录,则会引发以下错误:

"Msg 8114,级别16,状态5,第1行将数据类型varchar转换为数字错误。

我希望我的查询是:(a)计算“计数”函数中的“未清”记录,以及(b)为了和函数的目的,将“未清”视为“零”。因此,简单地修改标准以排除未清理结束日期是行不通的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-21 15:33:53

尽管y表示列中唯一的非数字字符串是“unliquidated”,但我不一定相信这一点。无论如何,这应该是安全的:

代码语言:javascript
复制
select count(primary_key),
       sum(case when isnumeric(amount) = 1 then cast(amount as numeric) end)
from table
where (criteria);

当字符串是货币金额或用科学符号书写时,ISNUMERIC返回1。在这种情况下,演员会失败,但这听起来似乎不会发生在这里。

请注意,您必须将该条件放入case语句中,否则仍可能会出现错误。

在Server 2012+中,还可以使用try_convert()

而且,我倾向于使用money而不是numeric作为目标数据类型。

票数 4
EN

Stack Overflow用户

发布于 2014-07-21 15:29:33

使用NullIF

代码语言:javascript
复制
select count(primary_key), sum(cast(nullif(amount,'unliquidated') as numeric))
from (table)
where (criteria)
票数 2
EN

Stack Overflow用户

发布于 2014-07-21 15:32:56

试试这个:

代码语言:javascript
复制
SELECT COUNT(primary_key), SUM(CASE ISNUMERIC(amount) WHEN 1 THEN cast(amount as numeric) END) AS Amount
FROM   (table)
WHERE  (criteria)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24868878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档