我有一个包含此类数据的列
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
答案 0 :(得分:3)
假设您无法对数据做任何事情,可以使用REGEXP_REPLACE
提取这些值:
SELECT id, REPLACE(REGEXP_REPLACE(column_name, '[^-]+ - ?([A-Z]{2},?)', '\1'),
',null', '')
FROM your_table
这是一个有效的 DEMO 。
答案 1 :(得分:2)
是的,可以做到。但是有一个很大的but
,SQL是一种查询语言,并不意味着格式化字符串或使用它们。更好地规范化数据库,因为在一列中保存所有数据是一个很好的指标,表明您仍然需要对表的规范化进行操作。最好在你的应用程序中完成这项工作,而不是使用sql在数据库上完成。
答案 2 :(得分:2)
是的,当然。
select substr(column_name, -2) from table_name
虽然如果你能让你的数据提供者为你做这件事会更好。
如果数据比指示的更脏,并且您使用的是Oracle 10g或更高版本,则可以使用regular expression route,但此处似乎并不需要。
select regexp_substr('California - CA', '[[:alpha:]]{2}$') from dual;
这里有一点SQL Fiddle来演示。
答案 3 :(得分:1)
请勿将列修改为您认为您想要它。在单个列中存储多个值是错误的。一劳永逸地修复表格:
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'