首页 > 解决方案 > 如何将不同类型的值插入表中的列?

问题描述

问题标题可能听起来很荒谬,但我会用下面的示例表解释我想做什么:

+------------+------------+----------------+----------+-------------------------+
|  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 |
+------------+------------+----------------+----------+-------------------------+

现在想仅向attrnameattrvalue列插入更多值,其中的值对应于以下内容:

+----------------+-------------------------+
|    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

所有其他列保持原样。

标签: sqlpython-3.xpostgresqlcsv

解决方案


我的第一个猜测是:

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');

推荐阅读