【问题标题】:Splitting a column into two将一列拆分为两列
【发布时间】:2015-10-14 15:13:41
【问题描述】:

我只想将包含街道编号和街道名称的地址列拆分为两列:街道编号和街道名称。街道号码和名称在地址栏中用空格分隔。我使用以下脚本根据空格分隔符将我提供的地址分成 2 列。

select left(Address, CHARINDEX(' ', Address)) as Street_Number,
       substring(Address, CHARINDEX(' ', Address)+1, len(Address)-(CHARINDEX(' ', Address)-1)) as Street_Name
from [dbo].XYZ

问题是在某些情况下,我的地址只有街道名称,在这种情况下,我希望街道编号列留空\null。

【问题讨论】:

  • 我从一个单独的表中获取地址列,然后使用代码拆分为街道编号和名称列,并将这两列存储在不同的表中
  • SQL CLR 在这里更合适。你可以使用它吗?

标签: sql sql-server


【解决方案1】:

一种方式:

;with t(Address) as (
    select '123 street lane' union all
    select '12a lane' union all
    select 'street lane' union all
    select 'street'
)
select 
    Address,
    case when Address like '[0-9]%' then
        left(Address, charindex(' ', Address) - 1)
    else
        ''
    end as Street_Number,
    case when Address like '[0-9]%' then
        substring(Address, charindex(' ', Address) + 1, len(Address))
    else
        Address
    end as Street_Name
from t

>>

Address         Street_Number   Street_Name
--------------- --------------- ---------------
123 street lane 123             street lane
12a lane        12a             lane
street lane                     street lane
street                          street

【讨论】:

    【解决方案2】:

    这就是我解决它的方式。我希望这将有所帮助。

    创建数据库TestDB 去

    使用测试数据库 去 --创建样本表CustomerAddress 创建表客户地址(地址字符(100)) 去

    插入客户地址值('123 Main St') 插入 CustomerAddress 值('XYZ St') 插入 CustomerAddress 值('abc')

    从客户地址中选择 *

    --选项#1a - 拆分地址列,当没有街道号码时替换为空值 选择
    Street_Number = CASE WHEN (ISNUMERIC(LEFT(Address, 1)) = 1) THEN LEFT(Address, CHARINDEX(' ', Address)) 别的 '' 结尾 , 街道名称 = CASE WHEN (ISNUMERIC(LEFT(Address, 1)) = 1) THEN substring(Address, CHARINDEX(' ', Address) + 1, len(Address) - (CHARINDEX(' ', Address) - 1)) 其他地址 结尾 FROM [dbo].CustomerAddress;

    --选项#1b - 拆分地址列,当没有街道号码时替换为 NULL 选择
    Street_Number = CASE WHEN (ISNUMERIC(LEFT(Address, 1)) = 1) THEN LEFT(Address, CHARINDEX(' ', Address)) 否则为空 结尾 , 街道名称 = CASE WHEN (ISNUMERIC(LEFT(Address, 1)) = 1) THEN substring(Address, CHARINDEX(' ', Address) + 1, len(Address) - (CHARINDEX(' ', Address) - 1)) 其他地址 结尾 FROM [dbo].CustomerAddress;

    --选项 #2a - 使用 LIKE % 而不是 ISNUMERIC,我们可能会获得更好的性能

    选择
    Street_Number = CASE WHEN (Address LIKE '[0-9]%') THEN LEFT(Address, CHARINDEX(' ', Address)) 否则为空 结束,

    Street_Name = CASE WHEN (Address LIKE '[0-9]%') THEN substring(Address, CHARINDEX(' ', Address) + 1, len(Address) - (CHARINDEX(' ', Address) - 1) ) 其他地址 结尾 FROM [dbo].CustomerAddress;

    --删除表进行清理 删除表 [dbo].CustomerAddress 去

    【讨论】:

    • 请查看如何在您的答案中格式化您的代码,请参阅下面的答案以获取示例。除此之外......欢迎!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多