gx19860411 发表于 2022-8-24 19:57

咨询个sql问题,关于货币单位转换

用的sql server,表里有个字段是价格,但单位不一,比如“200人民币”,下一条个就是“50美元”这样,有好多种单位。有什么方法能统一成人民币呢?就按现时汇率就行。最好是直接在软件里做。
眼下能想出的唯一办法就是全导出来用python处理然后再倒进去,但一共有几千万条,sql server导出好像会全读到内存再写成文件,上次导几百万条,64g内存就满了,然后电脑闪屏死机…

chachi 发表于 2022-8-24 20:00

可以试着用sql语句,根据币种update,不同币种 * 不同的汇率,可以手写汇率
常用的币种可能也就10来个吧,大概10来条就可以了,可以新增一个字段检查是否更新过,最后对没更新的条目手工再UPDATE

gx19860411 发表于 2022-8-24 20:18

chachi 发表于 2022-8-24 20:00
可以试着用sql语句,根据币种update,不同币种 * 不同的汇率,可以手写汇率
常用的币种可能也就10来个吧, ...

但是字段里数字和汉字部分的长度都不一样,我只会left right…
提取出纯数字和汉字的语句该怎么写呢?

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4

5long 发表于 2022-8-24 20:41

gx19860411 发表于 2022-8-24 20:18
但是字段里数字和汉字部分的长度都不一样,我只会left right…
提取出纯数字和汉字的语句该怎么写呢?


你可能需要正则表达式. Python 标准库里的 re 模块

—— 来自 S1Fun

すぴぱら 发表于 2022-8-24 20:42

gx19860411 发表于 2022-8-24 20:44

すぴぱら 发表于 2022-8-24 20:42
用python连接数据库查询之后更新进去不行吗?
不用把整张表导出吧

还真没想到这个路子,我搜搜去

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4

听剑客 发表于 2022-8-24 20:53

即使全导出来也是只导主键和钱这列两列,处理后根据主键逐一update回去都行。

gx19860411 发表于 2022-8-24 21:19

听剑客 发表于 2022-8-24 20:53
即使全导出来也是只导主键和钱这列两列,处理后根据主键逐一update回去都行。 ...

这样应该会小很多,明天试试

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4

帆影FX 发表于 2022-8-24 23:07

感觉你可以写 case when price like '%美元%'
thenreplace(price,'美元','') * 美元汇率 -- 把中文删了就好了XD
when ...
这种

gx19860411 发表于 2022-8-24 23:13

帆影FX 发表于 2022-8-24 23:07
感觉你可以写 case when price like '%美元%'
thenrep ...

超赞

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4

gx19860411 发表于 2022-8-25 12:13

帆影FX 发表于 2022-8-24 23:07
感觉你可以写 case when price like '%美元%'
thenrep ...

处理完结果全是NULL

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4

帆影FX 发表于 2022-8-25 13:31

gx19860411 发表于 2022-8-25 12:13
处理完结果全是NULL

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 ...

你是不是没用cast把字符串转成数字啊,我这个就是个大概的例子

帆影FX 发表于 2022-8-25 13:35

SELECT cast(replace('50美元','美元','') as int)*6.8 FROM demo;
这个我试了在SQL Server里面是能跑的

紧那罗 发表于 2022-8-25 13:59

应该把这个字段拆开 一个金额 一个币种

—— 来自 HUAWEI JAD-AL50, Android 10上的 S1Next-鹅版 v2.5.4

流嘟啊 发表于 2022-8-25 14:09

这种功能一般是程序处理的吧
数据量大就分批次处理呗

litel 发表于 2022-8-25 14:37

汇率呢。。。
原始数据不要动,调数据的地方实时处理吧。

hein 发表于 2022-8-25 21:27

新建2个字段吧,一个金额一个币种,用程序处理,sql反而慢。

坛子漆黑 发表于 2022-8-26 15:54

看情况一次查询100/1000/10000条记录,哪有把所有记录都查到内存里再处理的

zdn 发表于 2022-8-26 16:13

这肯定得加个币种的字段了,然后再增加个金额字段和cny字段,连一个汇率表,把数update到cny字段里

カドモン 发表于 2022-8-26 16:19

SQL咋写我不会
但是 Python 的话
单台机器按照 id 起几个进程手动分下片
Python 多进程按照 分片 去读记录,每次读取 limit 1000, 1000个内容记录在内存里,处理结束了一次性写入减少IO

当然你也可以给我一个夜宵钱我帮你写(

gx19860411 发表于 2022-8-26 19:49

zdn 发表于 2022-8-26 16:13
这肯定得加个币种的字段了,然后再增加个金额字段和cny字段,连一个汇率表,把数update到cny字段里 ...

请问我看不少都说要update,为啥不是
select A.*, B.CNY
into C
where A.ID=B.ID
呢?

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4

zdn 发表于 2022-8-26 23:04

也可以 再整个表用id连

YoumuChan 发表于 2022-8-26 23:50

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=a14d7a4dc52b1d449dc7a076d7dab199
这种感觉?

ballban 发表于 2022-8-27 02:23

SELECT
PATINDEX('%[^0-9.]%',price),
STUFF(price,PATINDEX('%[^0-9.]%',price),LEN(price),'') + '人民币'
FROM
item

随便写的(
几千万条估计跑不起来
为了未来着想建议还是把数字和单位分开来搞成俩列(

ballban 发表于 2022-8-27 02:24

本帖最后由 ballban 于 2022-8-27 02:25 编辑

风怒

gx19860411 发表于 2022-8-27 11:49

已经用python把导出的id和价格字段转成人民币了,可导入sql后update好慢啊…已经跑一夜了…

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4

精钢魔像 发表于 2022-8-27 12:27

gx19860411 发表于 2022-8-27 11:49
已经用python把导出的id和价格字段转成人民币了,可导入sql后update好慢啊…已经跑一夜了…

—— 来自 Xia ...

如果你那个表平时有查询和插入,数据量再一大,直接update不大好

默读者 发表于 2022-8-27 14:26

gx19860411 发表于 2022-8-27 18:43

精钢魔像 发表于 2022-8-27 12:27
如果你那个表平时有查询和插入,数据量再一大,直接update不大好

已经跑了19个小时了

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4

super_uni 发表于 2022-8-27 18:52

你这对汇率的要求,到时候追溯数据怎么办?两手一摊怪领导咯?

— from OPPO PEGM00, Android 12 of S1 Next Goose v2.5.4

gx19860411 发表于 2022-8-27 19:04

super_uni 发表于 2022-8-27 18:52
你这对汇率的要求,到时候追溯数据怎么办?两手一摊怪领导咯?

— from OPPO PEGM00, Android 12 o ...

原字段留着呢

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4

精钢魔像 发表于 2022-8-27 23:10

gx19860411 发表于 2022-8-27 18:43
已经跑了19个小时了

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 ...

不知你的表是怎么样的,我建议把要改的数据先放另一个表,再用个字段标记是否更新,每几百行提交一次
有中间表的数据,改完后写sql检查也容易些
页: [1]
查看完整版本: 咨询个sql问题,关于货币单位转换