首页 > 解决方案 > “万”在哪里?[整数输入语法无效:“1.1万”]

问题描述

我们正在构建一个数据处理平台,并使用 Greenplum 6.8.1 作为后端数据库。

在我们的平台中,有一个“清理”的动作,用户可以通过一些有意义的方式来处理他们上传的数据集,例如拆分列、强制转换和过滤等。但是最近在整个过程中发生了一些不寻常的事情。

顺便说一句,每个用户的操作都会在Greenplum中创建一个视图。并且该视图将根据他/她的最后一步操作结果创建。

例如,用户AA上传了这样的数据集。“ dataset.s_249_1626934066746 ”(有1969行,确实有“万”) 数据集截图

您可以使用此脚本创建此表。 s_249_1626934066746 SQL

顺便说一句,用户AA想找到一组热门商品(评分最高的商品)。所以AA有以下这些操作。

AA用“人”将“评估数据”(表示评分的数量)列拆分为“评估数据_1”,AA可以得到一个新的伪数学意义列“评估数据_拆分1”。

因为“评价数据”中的数据模式是num + “人” + “评价”(eg 1.1, 全民评分= 1.1万(中文100000000)+人+ 评分)

所以在后端,我们创建一个这样的视图

CREATE VIEW pipeline.view_tclean_19280_1627009588360 AS select split_part("评分人数", '人', 1) as "评分人数_拆分1",* from dataset.s_249_1626934066746

第一步快照

由于在“评估表_拆分1”中,仍有部分行包含“万”(中文10,000标记),无法比较,因此AA将其删除。

CREATE VIEW pipeline.view_tclean_19280_1627009588402 AS SELECT "评分人数_拆分1","pub_info","评分","name","播放弹幕追番","url","评分人数","_record_id_" FROM pipeline.view_tclean_19280_1627009588360 WHERE ("评分人数_拆分1" !~ E'万' OR "评分人数_拆分1" IS NULL) OR "评分人数_拆分1" = ''

第二步截图

而且它有效,整个视图只有 1756 行,所有包含“万”的行都消失了。

现在,AA想要将列“极大_拆分_拆分1”转换为数字类型,以便AA以后可以做一些过滤。

在后端,我们将其转换为 bigint 类型。

CREATE VIEW pipeline.view_tclean_19280_1627009588419 AS SELECT CAST("评分人数_拆分1" as bigint),"pub_info","评分","name","播放弹幕追番","url","评分人数","_record_id_" FROM pipeline.view_tclean_19280_1627009588402 

第三步截图

现在,当AA选择那些大于 3000 的评级数字时,会引发异常。

select * from pipeline.view_tclean_19280_1627009588419 where "评分人数_拆分1" > 3000 --invalid input syntax for integer: "1.1万"

整数的无效输入语法:“1.1万”;

为什么?“万”在哪里?很好奇为什么“万” 在某些地方仍然存在。

==============================================

像我这样的人,想找问题,发现如果继续将“评分_计算1”列转换成十进制类型,再做select查询,就可以了。

CREATE VIEW pipeline.view_tclean_19280_1627009588437 AS SELECT CAST("评分人数_拆分1" as decimal),"pub_info","评分","name","播放弹幕追番","url","评分人数","_record_id_" FROM pipeline.view_tclean_19280_1627009588419 

接着

select * from pipeline.view_tclean_19280_1627009588437 where "评分人数_拆分1" > 3000 --works (first convert INT, then DECIMAL)

为什么?我的“万”在哪里?

为什么它有效

=================================================

而我们又尝试了另一种方法,如果直接将“评分表格_拆分1”列转换为十进制类型,又失败了。

CREATE VIEW pipeline.view_tclean_19280_1627009588439 AS SELECT CAST("评分人数_拆分1" as decimal),"pub_info","评分","name","播放弹幕追番","url","评分人数","_record_id_" FROM pipeline.view_tclean_19280_1627009588402 

并为数字类型引发了相同的错误无效输入语法:“1.1万”;

select * from pipeline.view_tclean_19280_1627009588439 where "评分人数_拆分1" > 3000 --invalid input syntax for type numeric: "1.1万" 

我想哭。

像SQL一样,所有的 sql 都可以从这里获得

标签: sqlviewcjkgreenplum

解决方案


是的,这值得哭泣。

您从视图而不是表格中选择:

CAST("评分人数_拆分1" as bigint)

这意味着当你从视图中选择时,真正的演员就完成了。

报错说“你极大地单位_拆分1.1”有类似“万”的字样,不能转换成bigint。

您也许应该编写一个 sql 函数来将这样的字符串转换为 bigint。然而,这是你的工作,这里的人只会给你方向,不会为你做。


推荐阅读