Oracle SQL选择将“City,State”拆分为两列(仅包含State而不包含逗号的某些实例)并修剪空白
我见过这种解决方案,用于总是有逗号的数据,但在没有逗号的情况下似乎无法实现 数据来自如下所示的位置字段。。。其中一些数据是城市,州和其他行是没有列出城市的州Oracle SQL选择将“City,State”拆分为两列(仅包含State而不包含逗号的某些实例)并修剪空白,sql,oracle,regexp-substr,Sql,Oracle,Regexp Substr,我见过这种解决方案,用于总是有逗号的数据,但在没有逗号的情况下似乎无法实现 数据来自如下所示的位置字段。。。其中一些数据是城市,州和其他行是没有列出城市的州 [location_str] Boston, MA Miami, FL MO AK Fairbanks, AK 我想把他们分到两列[城市]和[州] 这个代码几乎可以工作 SELECT REGEXP_SUBSTR (location_str, '[^,]+', 1, 1) AS City, REGEXP_SU
[location_str]
Boston, MA
Miami, FL
MO
AK
Fairbanks, AK
我想把他们分到两列[城市]和[州]
这个代码几乎可以工作
SELECT REGEXP_SUBSTR (location_str, '[^,]+', 1, 1) AS City,
REGEXP_SUBSTR (location_str, '[^,]+', 1, 2) AS State
FROM Locations_Table
结果是
[City] [State]
Boston MA
Miami FL
MO NULL
AK NULL
Fairbanks AK
很接近,我只需要在[STATE]列中包含STATE而不包含逗号的行,在[City]列中包含NULL
最后一点是如何清理在其他地方生成的数据库中包含尾随和前导空格的location_str数据
[location_str]
" Fairbanks, AK"
"Fairbanks, AK "
"DC"
"DC "
"DC "
我明天可以试试这个,但是我可以用TRIM func来包装REGEXP\u SUBSTR吗?下面的工作是否会在这方面
TRIM(REGEXP_SUBSTR (location_str, '[^,]+', 1, 1)) AS City
我推荐一个case表达式:
SELECT (CASE WHEN location_str LIKE '%,%'
THEN REGEXP_SUBSTR(location_str, '[^,]+', 1, 1)
END) AS City,
(CASE WHEN location_str LIKE '%,%'
THEN REGEXP_SUBSTR(location_str, '[^,]+', 1, 2)
ELSE location_str
END) AS State
FROM Locations_Table
如果完全没有逗号,则可以在值的开头添加逗号,然后它将与当前解决方案一起使用:
SELECT REGEXP_SUBSTR (location_str, '[^,]+', 1, 1) AS City,
REGEXP_SUBSTR (location_str, '[^,]+', 1, 2) AS State
FROM
(Select case when instr(location_str,',') = 0 then ' ,' end || location_str as location_str
From locations_Table)
干杯 您甚至不需要正则表达式来满足您的需求;标准字符串函数,如instr和substr,速度更快,并且在这种情况下可以完美地工作 WITH子句不是查询的一部分;相反,我包含它只是为了生成测试数据。删除它,并从选择位置开始运行查询。。。在你的桌子上 正如你所怀疑的,特里姆。。。可以用于从每个结果子字符串的两侧修剪空间。请注意:这不会处理名称内的空格,例如“旧金山”或“北卡罗来纳”。如果需要,也可以处理这些问题,只需多做一点工作
with
test_data (location_str) as (
select 'Boston, MA' from dual union all
select ' Miami , FL ' from dual union all
select 'MO' from dual union all
select ' AK' from dual union all
select 'Fairbanks , AK ' from dual
)
select location_str,
trim(substr(location_str, 1, instr(location_str, ',') - 1)) as city,
trim(substr(location_str, instr(location_str, ',') + 1)) as state
from test_data
;
LOCATION_STR CITY STATE
------------------- ------------------- -------------------
Boston, MA Boston MA
Miami , FL Miami FL
MO MO
AK AK
Fairbanks , AK Fairbanks AK
又好又简单。我想那将是完美的。我明天会试试。有没有任何理由在TRIM函数中包装两个THEN-REGEXP\u-SUBSTR行和ELSE-location\u-str行不通?@TimK。我不清楚trim将如何用于此目的。解决问题的方法通常有5种,其他方法也有效,但这一种方法很快,还包括trim解决方案,因此我将其标记为答案。