【问题标题】:MySql- split cell and insert into another tableMySql-拆分单元格并插入另一个表
【发布时间】:2013-12-24 10:57:59
【问题描述】:

我有一个表 test 有一个列 state_numbers

id state_numbers
--------------
1 scr:1.0043;smb:0;rsm:0
2 scr:1.12;smb:0;rsm:0.3
3 scr:0.083;smb:0.65;rsm:0
4 scr:1.021;smb:0;rsm:0.2
5 scr:0.77;smb:0;rsm:0

我创建了一个名为 Status 的表,看起来像

 id scr smb rsm 总计
------ ------ ------ ------ ------
(null) (null) (null) (null) (null)

我需要一个查询来读取 state_numbers 中的值,根据关键字拆分表达式并将值放入 Status 表的相应列中。

我期待:

 id scr smb rsm 总计
------ ------ ------ ------ ------
1 1.0043 0 0(空)
2 1.12 0 0.3(空)
3 0.083 0.65 0(空)

然后我将能够在每一列中添加数据并在 total 列中进行更新。

最终输出:

 id scr smb rsm 总计
------ ------ ------ ------ ------
1 1.0043 0 0 1.0043
2 1.12 0 0.3 1.42
3 0.083 0.65 0 0.733

我将如何实现这一目标?帮助我拆分特定单元格并将数据插入不同的字段。

提前致谢!!!

P.S:请为这个问题建议一个合适的标题

【问题讨论】:

  • 你好,Jaywalker 反模式!明确的一点是 - 如果您选择了这样的数据模型,那么请重新考虑您的应用程序和数据库架构。如果你不能这样做(可能是一些遗留部分) - 那么你不应该在 SQL 中这样做,而是在应用程序中这样做 - 因为在通常情况下你将无法仅使用 SQL 解决问题(当然,你可以使用存储的 SQL 代码 - 但实际上,最好使用应用程序)

标签: mysql select split substring


【解决方案1】:

试试这个:

SELECT id, scr, smb, rsm, 
      (CAST(scr AS DECIMAL(18, 5)) + CAST(smb AS DECIMAL(18, 5)) + CAST(rsm AS DECIMAL(18, 5))) total
FROM (SELECT id, REPLACE(SUBSTRING_INDEX(state_numbers, ';', 1), 'scr:', '') scr, 
             REPLACE(SUBSTRING_INDEX(SUBSTRING_INDEX(state_numbers, ';', -2), ';', 1), 'smb:', '') smb, 
             REPLACE(SUBSTRING_INDEX(state_numbers, ';', -1), 'rsm:', '') rsm
      FROM test
     ) AS A  

【讨论】:

  • 我尝试使用您的查询,我在所有记录中得到相同的值
  • @damseldeebi 检查我更新的查询。我传递了静态值而不是列名。现在我已经纠正了
  • 效果很好!!非常感谢...我也能够将查询结果存储在另一个表中...
【解决方案2】:

您可以使用MySQL split function by Federico Cargnelutti.

Federico Cargnelutti 的功能:

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

你的 sql:

select id,
    scr,
    smb,
    rsm,
    cast(scr as DECIMAL(10,5))+cast(rsm as DECIMAL(10,5))+cast(smb as DECIMAL(10,5)) as     total 
from (
    select 
    id,
    trim(replace(SPLIT_STR(state_numbers, ';', 1),'scr:','')) as scr,
    trim(replace(SPLIT_STR(state_numbers, ';', 2),'smb:','')) as smb,
    trim(replace(SPLIT_STR(state_numbers, ';', 3),'rsm:','')) as rsm 
from test) as myTable;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2021-08-15
    • 2013-09-03
    相关资源
    最近更新 更多