有谁知道如何拆分我的地址列。我想将其分为三个新列,用逗号分隔。 例如1808 FOX CHASE DR, GOODLETTSVILLE, TN 分为
到目前为止我已经尝试过了
SELECT SUBSTRING(OwnerAddress, 1, INSTR(OwnerAddress, ',')-1) as col1,
SUBSTRING(OwnerAddress, INSTR(OwnerAddress, ',')+1) as col2
FROM housing_data;
虽然我无法使用州缩写创建第三列。
感谢您的任何意见
在目标库中进行任何类型的字符串处理通常要干净得多。也就是说,如果必须的话,您可以自由地使用
SUBSTRING
和 INSTR
来查找每个逗号并拆分字符串:
SELECT
SUBSTRING(OwnerAddress, 1, INSTR(OwnerAddress, ',') - 1) as col1,
SUBSTRING(SUBSTRING(OwnerAddress, INSTR(OwnerAddress, ',') + 1), 1, INSTR(SUBSTRING(OwnerAddress, INSTR(OwnerAddress, ',') + 1), ',') - 1) as col2,
SUBSTRING(SUBSTRING(OwnerAddress, INSTR(OwnerAddress, ',') + 1), INSTR(SUBSTRING(OwnerAddress, INSTR(OwnerAddress, ',') + 1), ',') + 1) as col3
FROM housing_data;
您也可以使用递归。对于一个本应简单的问题来说有点矫枉过正。但是,在这里,您可以分割所提供的尽可能多的逗号。
CREATE TABLE addresses AS
SELECT '1808 FOX CHASE DR, GOODLETTSVILLE, TN' AS address;
WITH RECURSIVE cte (address, remaining_address) AS (
SELECT CASE WHEN a.address LIKE '%, %'
THEN SUBSTRING(a.address, 1, INSTR(a.address, ', ')-1)
ELSE a.address
END AS address
, SUBSTRING( SUBSTRING(a.address, INSTR(a.address, ', ')+1), 1) AS remaining_address
FROM addresses AS a
UNION ALL
SELECT CASE WHEN c.remaining_address LIKE '%, %'
THEN SUBSTRING(c.remaining_address, 1, INSTR(c.remaining_address, ', ')-1)
ELSE c.remaining_address END AS address
, CASE WHEN c.remaining_address LIKE '%, %'
THEN SUBSTRING( SUBSTRING(c.remaining_address, INSTR(c.remaining_address, ', ')+1), 1)
END AS remaining_address
FROM cte c
WHERE c.address <> ''
AND c.address IS NOT NULL
)
SELECT COUNT(*) OVER (ORDER BY address DESC) AS address_id
, address
FROM cte
WHERE address <> ''
AND address IS NOT NULL
GROUP BY address;
您必须进一步将其修复到列中,但这是可行的,并且您可以添加逻辑来处理潜在的额外逗号。
DROP TABLE IF EXISTS addresses;
CREATE TABLE addresses AS
SELECT '1808 FOX CHASE DR, APT.1, SUBUNIT 10, GOODLETTSVILLE, TN' AS address;
WITH RECURSIVE cte (address, city, state, remaining_address) AS (
SELECT CASE WHEN a.address LIKE '%, %'
THEN SUBSTRING(a.address, 1, INSTR(a.address, ', ')-1)
ELSE a.address
END AS address
, NULL AS city
, NULL AS state
, SUBSTRING( SUBSTRING(a.address, INSTR(a.address, ', ')+1), 1) AS remaining_address
FROM addresses AS a
UNION ALL
SELECT CASE WHEN c.remaining_address LIKE '%, %, %'
THEN c.address || ', ' || SUBSTRING(c.remaining_address, 1, INSTR(c.remaining_address, ', ')-1)
ELSE c.address END AS address
, CASE WHEN c.city IS NOT NULL
THEN c.city
WHEN c.remaining_address LIKE '%, %, %'
THEN NULL
WHEN c.remaining_address LIKE '%, %'
THEN SUBSTRING(c.remaining_address, 1, INSTR(c.remaining_address, ', ')-1)
ELSE c.remaining_address END AS city
, CASE WHEN c.remaining_address NOT LIKE '%, %' THEN c.remaining_address END AS state
, CASE WHEN c.remaining_address LIKE '%, %'
THEN SUBSTRING( SUBSTRING(c.remaining_address, INSTR(c.remaining_address, ', ')+1), 1)
END AS remaining_address
FROM cte c
WHERE c.state IS NULL
)
SELECT address, city, state
FROM cte
WHERE state IS NOT NULL
输出: