Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-根据特定列值创建两个新行条目_Sql_Postgresql - Fatal编程技术网

SQL-根据特定列值创建两个新行条目

SQL-根据特定列值创建两个新行条目,sql,postgresql,Sql,Postgresql,我有一个数据库表,其中包含一些地址数据。我的问题是有些行有两个housenumber条目,如下所示: '8, 8A' '12,14' 我想做的是: 将此行拆分为两个单独的行 新行中的每一行都有特定的门牌号 删除包含两个条目的旧行 新行的其他列的值应与以前相同 housenumber列是一个文本字段,因为可以添加诸如“a”、“B”等内容。 我想知道在sql中是否有任何方法可以做到这一点,因此非常感谢您的帮助 编辑 我的桌子是这样的: 那么: select left(col_1, charin

我有一个数据库表,其中包含一些地址数据。我的问题是有些行有两个housenumber条目,如下所示:

'8, 8A'
'12,14'
我想做的是:

  • 将此行拆分为两个单独的行
  • 新行中的每一行都有特定的门牌号
  • 删除包含两个条目的旧行
  • 新行的其他列的值应与以前相同
housenumber列是一个文本字段,因为可以添加诸如“a”、“B”等内容。 我想知道在sql中是否有任何方法可以做到这一点,因此非常感谢您的帮助

编辑

我的桌子是这样的:

那么:

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

我想你的桌子上有比那一栏更多的东西吧?在示例数据中再添加一列,并指定预期的结果。我想您的表中有多于该列的内容吗?向示例数据中再添加一列,并指定预期结果。