mysql - 根据 MySQL 5.6 和 ORACLE 11 和 ORACLE 12 中的现有列填充列
问题描述
我有一个表,其中一列是 varchar 类型,其中包含“1.2.1”、“1”、“0.2”等值。
通常最多有 3 个数字,用小数 (.)
我需要创建 3 个整数类型的新列来保存这 3 个数字。
示例数据如下所示。
此外,数据也可以包含一些字符串值,但它固定为最后附加的一个字符串,用连字符 (-) 分隔。例如 1.2.1-xyz。如果数据是这样的,字符串值应该转到第四列。
此案例数据如下所示:
这是我为实现此要求而编写的查询。
请在 SQLFiddle http://sqlfiddle.com/#!9/5aaeb4/1下方找到
有没有更好的方法来做到这一点?我是数据库方面的新手,所以请提出一些优化的方法来实现这一点。
解决方案
在 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 | | |
推荐阅读
- android - API 27 上的 Android 不同风格
- python - Matplotlib plt.plot_date() 如何根据第三列设置点的颜色
- wildfly - 如何配置 Wildfly 14 模块的安装和定位路径?
- python - 对于列表的每个元素,从不同的列表中找到最接近的日期
- javascript - 如何过滤反应中的唯一值?
- python - TensorFlow 无法正确导入
- ios - 自定义呈现的 UINavigationController 在转换期间与 UICollectionView 的 contentOffset 发生故障
- sql - ORA-01722: 在 Toad for Oracle 中执行选择后数字无效
- linux - 使用本机方法从 bash 中的 XML 文件中获取特定的嵌套值
- configuration - IIS 管理器仅显示 2 个图标(IIS 8 Server 2012 R2)