我们正在建立一个数据处理平台,并使用Greenprie6.8.1作为后端数据库。
在我们的平台中,有一个“清洁”操作,用户可以以一些有意义的方式处理他们上传的数据集,比如拆分列、强制转换和过滤等等。但是最近在整个过程中发生了一些不寻常的事情。
顺便说一句,每个用户的操作都会在Greenplum中创建一个视图。该视图将根据他/她的最后一步操作结果创建。
例如,用户AA上传了这样的数据集。"dataset.s_249_1626934066746“(有1969年的行,还有do有"万") 数据集截图
您可以使用此脚本创建此表。1626934066746 SQL
顺便说一句,用户AA想要找到一组受欢迎的项目(排名最高的项目)。因此,AA有以下操作。
AA使用"人“将列"评价人数”(表示等级的数字)拆分为"评价人数_拆分1",AA可以得到一个新的伪数学意义列"评价人数_拆分1“。
由于"评价人数“中的数据模式为num + "人”+ "rated“(例如1.1万人评分=1.1万(中文10,000标记)+人+评分)
所以在后端,我们创建了这样一个视图
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。
发布于 2021-07-23 07:10:21
是的,这值得一哭。
您可以从视图(而不是表)中选择:
CAST("评分人数_拆分1" as bigint)这意味着当您从视图中进行选择时,将完成真正的强制转换。
你看到的错误说"评分人数_拆分1“有一些类似于"1.1万”的东西,不能抛给bigint。
您可能应该编写一个sql函数来将这样的字符串转换为bigint。然而,这是你的工作,这里的人只会给你方向,而不会为你做。
发布于 2021-07-23 09:57:17
LOL,
我不知道为什么,但它有效。
select * from pipeline.view_tclean_19280_1627009588419 where "评分人数_拆分1" > 3000::numerichttps://stackoverflow.com/questions/68495052
复制相似问题