我有一列包含这样的数据
1 Virginia - VA,Maryland -MD,null
2 California - CA,Nebraska - NE,Minnesota - MN
3 Wyoming - WY,null,null
等等。有没有办法我可以使用字符串函数修改列,使其看起来像普通的 sql?
1 VA,MD
2 CA,NE,MN
3 WY
假设您对数据无能为力,您可以使用以下方法提取这些值REGEXP_REPLACE
:
SELECT id, REPLACE(REGEXP_REPLACE(column_name, '[^-]+ - ?([A-Z]{2},?)', '\1'),
',null', '')
FROM your_table
这是一个有效的演示。
是的当然。
select substr(column_name, -2) from table_name
虽然如果你能让你的数据提供者为你做这件事会更好。
如果数据比指示的更脏并且您使用的是 Oracle 10g 或更高版本,您可以使用正则表达式路线,但这里似乎不需要。
select regexp_substr('California - CA', '[[:alpha:]]{2}$') from dual;
这是一个小SQL Fiddle来演示。
是的,它可以做到。但是有一个很大的but
,SQL 是一种查询语言,并不意味着格式化字符串或使用它们。更好地规范化您的数据库,因为将所有数据保存在一个列中是一个很好的指标,表明您在表的规范化方面仍有工作要做。最好在您的应用程序中完成这项工作,而不是在使用 sql 的数据库上。
不要将列修改为您认为您想要的样子。在单个列中存储多个值是不好的。一劳永逸地修复表格:
SELECT col1 AS ID, SUBSTR(SUBSTR(col2, 1, INSTR(col2, ',', 1, 1)-1), -2) AS STATE
FROM badTable
WHERE SUBSTR(SUBSTR(col2, 1, INSTR(col2, ',', 1, 1)-1), -4) <> 'null'
UNION ALL
SELECT col1 AS ID, SUBSTR(SUBSTR(col2, 1, INSTR(col2,',', 1, 2)-1), -2) AS STATE
FROM badTable
WHERE SUBSTR(SUBSTR(col2, 1, INSTR(col2,',', 1, 2)-1), -4) <> 'null'
UNION ALL
SELECT col1 AS ID, SUBSTR(col2, -2) AS STATE
FROM badTable
WHERE SUBSTR(col2, -4) <> 'null'