如何在表中的列中插入不同类型的值?

时间:2019-05-27 12:18:57

标签: sql python-3.x postgresql csv

这个问题的标题听起来很荒谬,但是我将用下面的示例表来解释我想做的事情:

+------------+------------+----------------+----------+-------------------------+
|  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文件中读取。

EDIT-2:

我知道我会使用postgres copy命令,实际上我在python脚本中使用了postgres copy_from。 我的特定问题是从csv文件读取值,以便对于csv文件的每一行,将值插入到attrvalue列中,并更新相应的attrname,以便:

For line1: 38.7,2,London Street,-8.603257,41.183778,2016-05-24T18:38:15.00Z

我得到以下对应关系(attrname设置为like):

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

所有其他列保持不变。

2 个答案:

答案 0 :(得分:0)

我的第一个猜测是:

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

答案 1 :(得分:0)

您可以使用特定于列的查询插入记录,如下所示: 插入table_name(attrname,attrvalue)值(“ dateObserved”,“ 2016-05-24T18:38:15.00Z”);

在此处,将值替换为您想要插入的期望值。 注意:确保此表上没有主键时将执行此查询。如果任何列上都存在主键,则我们还需要将该列添加为唯一值