sql - “万”在哪里?[整数输入语法无效:“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”列转换成十进制类型,再做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 都可以从这里获得
解决方案
是的,这值得哭泣。
您从视图而不是表格中选择:
CAST("评分人数_拆分1" as bigint)
这意味着当你从视图中选择时,真正的演员就完成了。
报错说“你极大地单位_拆分1.1”有类似“万”的字样,不能转换成bigint。
您也许应该编写一个 sql 函数来将这样的字符串转换为 bigint。然而,这是你的工作,这里的人只会给你方向,不会为你做。
推荐阅读
- android - getContext() 无法识别
- csv - 将多个 CSV 文件合并到 gdrive 上的单个文件中
- linker - 允许使用 dlopen() 加载的插件动态链接到它们自己目录中的共享对象
- c++ - 在运行时将更改的环境变量应用于 QApplication
- c++ - 使用 lambda 比较初始化优先级队列的方法
- javascript - MS SQL 在 NodeJS 中不返回数据
- java - 如何拆分一串 8 个数字并分别访问它们?
- python-3.x - 如何优化以避免使用过多的 'if' 'elif' 'else' 语句并有效降低圈复杂度?
- python - 将 python 代码实现为 cython 代码
- c# - 在两个 asp 核心 api 之间共享 Jwt 令牌