这个问题的标题听起来很荒谬,但是我将用下面的示例表来解释我想做的事情:
+------------+------------+----------------+----------+-------------------------+
| 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文件中读取。
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
所有其他列保持不变。
答案 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”);
在此处,将值替换为您想要插入的期望值。 注意:确保此表上没有主键时将执行此查询。如果任何列上都存在主键,则我们还需要将该列添加为唯一值