基于MySQL5.6、oracle 11和oracle 12中的现有列填充列

pgky5nke  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(280)

我有一个表,其中一列是varchar类型,包含值“1.2.1”、“1”、“0.2”等。
一般情况下,最多有3个数字由十进制(.)分隔
我需要创建3个整数类型的新列来保存这3个数字。
示例数据如下所示。

此外,数据也可以包含一些字符串值,但它固定为最后附加的一个字符串,用连字符(-)分隔。例如1.2.1-xyz。如果数据是这样的,字符串值应该转到第四列。
此案例数据如下所示:

这是我为达到这个要求而编写的查询。
请在小提琴下面找http://sqlfiddle.com/#!9月5日4月1日
有没有更好的办法?我是新的数据库方面,所以请建议一些优化的方法来实现这一点。

8oomwypt

8oomwypt1#

在mysql中,我们可以使用 Substring_Index() 函数以及用户定义的变量。变量帮助我们避免重复某些字符串操作。
架构(mysql v5.7)

CREATE TABLE IF NOT EXISTS `table1` (
  `mainCol` varchar(45) NOT NULL 
) DEFAULT CHARSET=utf8;
INSERT INTO `table1` (`mainCol`) VALUES
  ('1.2.1'),
  ('0.2'),
  ('1'), 
  ('1.2.1-xyz'),
  ('1.2');

查询

SELECT 
  mainCol, 

  @first := SUBSTRING_INDEX(mainCol, '.', 1) AS col1, 

  TRIM(LEADING '.' FROM 
       REPLACE(@second := SUBSTRING_INDEX(mainCol, '.', 2), 
               @first,
               '')
      ) AS col2,  

  @fourth := CASE WHEN INSTR(mainCol, '-') 
                  THEN SUBSTRING_INDEX(mainCol, '-', -1)
                  ELSE ''
             END AS col4, 

  REPLACE(TRIM(LEADING '.' FROM 
               REPLACE(SUBSTRING_INDEX(mainCol, '.', 3), 
                       @second,
                       '')
               ), 
          CONCAT('-', @fourth), 
          '') AS col3 
FROM table1
CROSS JOIN (SELECT @first := '', 
                   @second := '', 
                   @third := '',
                   @fourth := '') AS user_vars;

结果

| mainCol   | col1 | col2 | col4 | col3 |
| --------- | ---- | ---- | ---- | ---- |
| 1.2.1     | 1    | 2    |      | 1    |
| 0.2       | 0    | 2    |      |      |
| 1         | 1    |      |      |      |
| 1.2.1-xyz | 1    | 2    | xyz  | 1    |
| 1.2       | 1    | 2    |      |      |

db fiddle视图

相关问题