sql - 如何将不同类型的值插入表中的列?
问题描述
问题标题可能听起来很荒谬,但我会用下面的示例表解释我想做什么:
+------------+------------+----------------+----------+-------------------------+
| recvtime | entitytype | attrname | attrtype | attrvalue |
+------------+------------+----------------+----------+-------------------------+
| 2019-05-27 | Noise | measurand | Number | 51.7 |
| 2019-05-27 | Noise | sonometerClass | Text | 1 |
| 2019-05-27 | Noise | name | Text | City Centre |
| 2019-05-27 | Noise | longitude | Number | -8.65915 |
| 2019-05-27 | Noise | latitude | Number | 41.1591 |
| 2019-05-27 | Noise | dateObserved | DateTime | 2016-05-24T18:38:15.00Z |
+------------+------------+----------------+----------+-------------------------+
现在想仅向attrname
和attrvalue
列插入更多值,其中的值对应于以下内容:
+----------------+-------------------------+
| attrname | attrvalue |
+----------------+-------------------------+
| measurand | 38.7 |
| sonometerClass | 2 |
| name | London Street |
| longitude | -8.603257 |
| latitude | 41.183778 |
| dateObserved | 2016-05-24T18:38:15.00Z |
+----------------+-------------------------+
我如何在 SQL 中实现这一点?我真的不介意将所有其他列的值保持原样(即重复它们的值)。
编辑
虽然我承认 Gordon Linoff 的回答,但它并不能解决我的问题,因为这些值实际上是从以下形式的 csv 文件中读取的:
measurand,sonometerClass,name,longitude,latitude,dateObserved
38.7,2,London Street,-8.603257,41.183778,2016-05-24T18:38:15.00Z
90.4,1,Hospital de S. Joao,-8.603257,41.183778,2014-07-12T6:18:15.00Z
59.3,0,City Campus,-8.594866,41.178031,2014-08-12T16:10:10.00Z
64.5,1,ABC Beach,-8.607085,41.15001,2015-10-11T16:10:10.00Z
这些值不是直接来自用户输入,而是从格式如上的 csv 文件中读取。
编辑-2:
我知道我会使用 postgrescopy
命令,实际上我copy_from
在 python 脚本中使用 postgres。我的具体问题是从 csv 文件中读取值,以便对于文件的每一行,将csv
值插入到attrvalue
相应attrname
更新的列中,以便:
For line1: 38.7,2,London Street,-8.603257,41.183778,2016-05-24T18:38:15.00Z
我得到以下对应关系(attrname
设置为喜欢):
measurand = 38.7
sonometerClass = 2
name = London Street
longitude = -8.603257
latitude = 41.183778
dateObserved = 2016-05-24T18:38:15.00Z
相似地,
For line2: 90.4,1,Hospital de S. Joao,-8.603257,41.183778,2014-07-12T6:18:15.00Z
我得到以下信息:
measurand = 90.4
sonometerClass = 1
name = Hospital de S. Joao
longitude = -8.603257
latitude = 41.183778
dateObserved = 2014-07-12T6:18:15.00Z
所有其他列保持原样。
解决方案
我的第一个猜测是:
insert into t (recvtime, entitytype, attrname, attrtype, attrvalue)
values ('2019-05-27', 'Noise', 'measurand', 'number', '38.7'),
('2019-05-27', 'Noise', 'sonometerClass', 'text', '2'),
('2019-05-27', 'Noise', 'name', 'text', 'London Street'),
('2019-05-27', 'Noise', 'longitude', 'number', '-8.603257'),
('2019-05-27', 'Noise', 'latitude', 'number', '41.183778'),
('2019-05-27', 'Noise', 'dateobserved', 'datetime', '2016-05-24T18:38:15.00Z');
推荐阅读
- android - 无法在 android 模块上导入 .tflite 模型
- outlook - 在 Outlook 中附加的最近项目不同
- node.js - 得到“ERR_CRYPTO_INVALID_IV”。为什么?
- javascript - 如何清理任何请求或任何页面
- reactjs - MongoDB过滤和排序数组
- three.js - 创建比实际场景对象更大的点击目标的有效方法
- react-native - 在 react-native 项目中我收到错误 - 无法解析 /src/overflowMenu/OverflowMenuContext
- python - 使用 Python 进行 Elasticsearch 批量插入 - 套接字超时错误
- angular - 如何在 Angular Mat 卡片内容中翻译 html 标签
- bitbucket - 如何完全控制其他人的私有 bitbucket 存储库