在 SQLite 中分割字符串

问题描述 投票:0回答:2

有谁知道如何拆分我的地址列。我想将其分为三个新列,用逗号分隔。 例如1808 FOX CHASE DR, GOODLETTSVILLE, TN 分为

  • 1808 福克斯追逐博士
  • 古德利茨维尔
  • TN

到目前为止我已经尝试过了

SELECT SUBSTRING(OwnerAddress, 1, INSTR(OwnerAddress, ',')-1) as col1,
SUBSTRING(OwnerAddress, INSTR(OwnerAddress, ',')+1) as col2  
FROM housing_data;

虽然我无法使用州缩写创建第三列。

感谢您的任何意见

sql sqlite split strsplit
2个回答
1
投票

在目标库中进行任何类型的字符串处理通常要干净得多。也就是说,如果必须的话,您可以自由地使用

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;

0
投票

您也可以使用递归。对于一个本应简单的问题来说有点矫枉过正。但是,在这里,您可以分割所提供的尽可能多的逗号。

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

输出:

© www.soinside.com 2019 - 2024. All rights reserved.