SQL-根据特定列值创建两个新行条目
我有一个数据库表,其中包含一些地址数据。我的问题是有些行有两个housenumber条目,如下所示:SQL-根据特定列值创建两个新行条目,sql,postgresql,Sql,Postgresql,我有一个数据库表,其中包含一些地址数据。我的问题是有些行有两个housenumber条目,如下所示: '8, 8A' '12,14' 我想做的是: 将此行拆分为两个单独的行 新行中的每一行都有特定的门牌号 删除包含两个条目的旧行 新行的其他列的值应与以前相同 housenumber列是一个文本字段,因为可以添加诸如“a”、“B”等内容。 我想知道在sql中是否有任何方法可以做到这一点,因此非常感谢您的帮助 编辑 我的桌子是这样的: 那么: select left(col_1, charin
'8, 8A'
'12,14'
我想做的是:
- 将此行拆分为两个单独的行
- 新行中的每一行都有特定的门牌号
- 删除包含两个条目的旧行
- 新行的其他列的值应与以前相同
select left(col_1, charindex(',', col_1))
from table_1
where charindex(',', col_1) > 0
union
select substring(col_1, charindex(',', col_1), 255)
from table_1
where charindex(',', col_1) > 0
union
select col_1
from table_1
where charindex(',', col_1) = 0
那么:
select left(col_1, charindex(',', col_1))
from table_1
where charindex(',', col_1) > 0
union
select substring(col_1, charindex(',', col_1), 255)
from table_1
where charindex(',', col_1) > 0
union
select col_1
from table_1
where charindex(',', col_1) = 0
如果没有所有栏目的知识,很难说,但基本上想法是: 准备:
t=# with a(i,addr) as (values(1,$$'8, 8A'
'12,14'$$))
select * into so4 from a;
SELECT 1
检查:
t=# select * from so4;
i | addr
---+---------
1 | '8, 8A'+
| '12,14'
(1 row)
t=# select * from so4;
i | addr
---+---------
1 | '8, 8A'
1 | '12,14'
(2 rows)
行动:
t=# with a as (select i, unnest(string_to_array(addr,chr(10))) from so4 group by i, addr)
, i as (insert into so4 select * from a)
delete from so4 using a where a.i = so4.i and a.unnest <> so4.addr
;
DELETE 1
如果没有所有栏目的知识,很难说,但基本上想法是: 准备:
t=# with a(i,addr) as (values(1,$$'8, 8A'
'12,14'$$))
select * into so4 from a;
SELECT 1
检查:
t=# select * from so4;
i | addr
---+---------
1 | '8, 8A'+
| '12,14'
(1 row)
t=# select * from so4;
i | addr
---+---------
1 | '8, 8A'
1 | '12,14'
(2 rows)
行动:
t=# with a as (select i, unnest(string_to_array(addr,chr(10))) from so4 group by i, addr)
, i as (insert into so4 select * from a)
delete from so4 using a where a.i = so4.i and a.unnest <> so4.addr
;
DELETE 1
你可以这样做
数据
CREATE TABLE address
(house_number VARCHAR(20),
street VARCHAR(100));
INSERT INTO address VALUES ('8, 8A', 'High Street');
INSERT INTO address VALUES ('12, 14', 'New Street');
INSERT INTO address VALUES ('1', 'First Street');
解决方案
SELECT TRIM(adr_split.house_number) AS house_number, adr.street
FROM address adr, UNNEST(STRING_TO_ARRAY(adr.house_number, ',')) adr_split(house_number);
输出
house_number street
8 High Street
8A High Street
12 New Street
14 New Street
1 First Street
在用旧数据替换此输出方面,您可以这样做
CREATE TABLE new_address
(house_number VARCHAR(20),
street VARCHAR(100));
INSERT INTO new_address
SELECT TRIM(adr_split.house_number) AS house_number, adr.street
FROM address adr, UNNEST(STRING_TO_ARRAY(adr.house_number, ',')) adr_split(house_number);
DROP TABLE address;
ALTER TABLE new_address RENAME TO address;
现在,地址表将如您所期望的那样拥有数据
输出
SELECT * FROM address;
house_number street
8 High Street
8A High Street
12 New Street
14 New Street
1 First Street
你可以这样做
数据
CREATE TABLE address
(house_number VARCHAR(20),
street VARCHAR(100));
INSERT INTO address VALUES ('8, 8A', 'High Street');
INSERT INTO address VALUES ('12, 14', 'New Street');
INSERT INTO address VALUES ('1', 'First Street');
解决方案
SELECT TRIM(adr_split.house_number) AS house_number, adr.street
FROM address adr, UNNEST(STRING_TO_ARRAY(adr.house_number, ',')) adr_split(house_number);
输出
house_number street
8 High Street
8A High Street
12 New Street
14 New Street
1 First Street
在用旧数据替换此输出方面,您可以这样做
CREATE TABLE new_address
(house_number VARCHAR(20),
street VARCHAR(100));
INSERT INTO new_address
SELECT TRIM(adr_split.house_number) AS house_number, adr.street
FROM address adr, UNNEST(STRING_TO_ARRAY(adr.house_number, ',')) adr_split(house_number);
DROP TABLE address;
ALTER TABLE new_address RENAME TO address;
现在,地址表将如您所期望的那样拥有数据
输出
SELECT * FROM address;
house_number street
8 High Street
8A High Street
12 New Street
14 New Street
1 First Street
我想你的桌子上有比那一栏更多的东西吧?在示例数据中再添加一列,并指定预期的结果。我想您的表中有多于该列的内容吗?向示例数据中再添加一列,并指定预期结果。