咨询个sql问题,关于货币单位转换
用的sql server,表里有个字段是价格,但单位不一,比如“200人民币”,下一条个就是“50美元”这样,有好多种单位。有什么方法能统一成人民币呢?就按现时汇率就行。最好是直接在软件里做。眼下能想出的唯一办法就是全导出来用python处理然后再倒进去,但一共有几千万条,sql server导出好像会全读到内存再写成文件,上次导几百万条,64g内存就满了,然后电脑闪屏死机… 可以试着用sql语句,根据币种update,不同币种 * 不同的汇率,可以手写汇率
常用的币种可能也就10来个吧,大概10来条就可以了,可以新增一个字段检查是否更新过,最后对没更新的条目手工再UPDATE chachi 发表于 2022-8-24 20:00
可以试着用sql语句,根据币种update,不同币种 * 不同的汇率,可以手写汇率
常用的币种可能也就10来个吧, ...
但是字段里数字和汉字部分的长度都不一样,我只会left right…
提取出纯数字和汉字的语句该怎么写呢?
—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 gx19860411 发表于 2022-8-24 20:18
但是字段里数字和汉字部分的长度都不一样,我只会left right…
提取出纯数字和汉字的语句该怎么写呢?
你可能需要正则表达式. Python 标准库里的 re 模块
—— 来自 S1Fun すぴぱら 发表于 2022-8-24 20:42
用python连接数据库查询之后更新进去不行吗?
不用把整张表导出吧
还真没想到这个路子,我搜搜去
—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 即使全导出来也是只导主键和钱这列两列,处理后根据主键逐一update回去都行。 听剑客 发表于 2022-8-24 20:53
即使全导出来也是只导主键和钱这列两列,处理后根据主键逐一update回去都行。 ...
这样应该会小很多,明天试试
—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 感觉你可以写 case when price like '%美元%'
thenreplace(price,'美元','') * 美元汇率 -- 把中文删了就好了XD
when ...
这种 帆影FX 发表于 2022-8-24 23:07
感觉你可以写 case when price like '%美元%'
thenrep ...
超赞
—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 帆影FX 发表于 2022-8-24 23:07
感觉你可以写 case when price like '%美元%'
thenrep ...
处理完结果全是NULL
—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 gx19860411 发表于 2022-8-25 12:13
处理完结果全是NULL
—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 ...
你是不是没用cast把字符串转成数字啊,我这个就是个大概的例子 SELECT cast(replace('50美元','美元','') as int)*6.8 FROM demo;
这个我试了在SQL Server里面是能跑的 应该把这个字段拆开 一个金额 一个币种
—— 来自 HUAWEI JAD-AL50, Android 10上的 S1Next-鹅版 v2.5.4 这种功能一般是程序处理的吧
数据量大就分批次处理呗 汇率呢。。。
原始数据不要动,调数据的地方实时处理吧。 新建2个字段吧,一个金额一个币种,用程序处理,sql反而慢。 看情况一次查询100/1000/10000条记录,哪有把所有记录都查到内存里再处理的 这肯定得加个币种的字段了,然后再增加个金额字段和cny字段,连一个汇率表,把数update到cny字段里 SQL咋写我不会
但是 Python 的话
单台机器按照 id 起几个进程手动分下片
Python 多进程按照 分片 去读记录,每次读取 limit 1000, 1000个内容记录在内存里,处理结束了一次性写入减少IO
当然你也可以给我一个夜宵钱我帮你写( 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 也可以 再整个表用id连 https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=a14d7a4dc52b1d449dc7a076d7dab199
这种感觉? SELECT
PATINDEX('%[^0-9.]%',price),
STUFF(price,PATINDEX('%[^0-9.]%',price),LEN(price),'') + '人民币'
FROM
item
随便写的(
几千万条估计跑不起来
为了未来着想建议还是把数字和单位分开来搞成俩列( 本帖最后由 ballban 于 2022-8-27 02:25 编辑
风怒 已经用python把导出的id和价格字段转成人民币了,可导入sql后update好慢啊…已经跑一夜了…
—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 gx19860411 发表于 2022-8-27 11:49
已经用python把导出的id和价格字段转成人民币了,可导入sql后update好慢啊…已经跑一夜了…
—— 来自 Xia ...
如果你那个表平时有查询和插入,数据量再一大,直接update不大好
精钢魔像 发表于 2022-8-27 12:27
如果你那个表平时有查询和插入,数据量再一大,直接update不大好
已经跑了19个小时了
—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 你这对汇率的要求,到时候追溯数据怎么办?两手一摊怪领导咯?
— from OPPO PEGM00, Android 12 of S1 Next Goose v2.5.4 super_uni 发表于 2022-8-27 18:52
你这对汇率的要求,到时候追溯数据怎么办?两手一摊怪领导咯?
— from OPPO PEGM00, Android 12 o ...
原字段留着呢
—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 gx19860411 发表于 2022-8-27 18:43
已经跑了19个小时了
—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 ...
不知你的表是怎么样的,我建议把要改的数据先放另一个表,再用个字段标记是否更新,每几百行提交一次
有中间表的数据,改完后写sql检查也容易些
页:
[1]