1

我有一列包含这样的数据

     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
4

4 回答 4

3

假设您对数据无能为力,您可以使用以下方法提取这些值REGEXP_REPLACE

SELECT id, REPLACE(REGEXP_REPLACE(column_name, '[^-]+ - ?([A-Z]{2},?)', '\1'), 
           ',null', '')
FROM your_table

这是一个有效的演示

于 2012-09-13T19:05:40.877 回答
2

是的当然。

select substr(column_name, -2) from table_name

虽然如果你能让你的数据提供者为你做这件事会更好。

如果数据比指示的更脏并且您使用的是 Oracle 10g 或更高版本,您可以使用正则表达式路线,但这里似乎不需要。

select regexp_substr('California - CA', '[[:alpha:]]{2}$') from dual;

这是一个小SQL Fiddle来演示。

于 2012-09-13T19:04:38.460 回答
2

是的,它可以做到。但是有一个很大的but,SQL 是一种查询语言,并不意味着格式化字符串或使用它们。更好地规范化您的数据库,因为将所有数据保存在一个列中是一个很好的指标,表明您在表的规范化方面仍有工作要做。最好在您的应用程序中完成这项工作,而不是在使用 sql 的数据库上。

于 2012-09-13T18:59:24.720 回答
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'

SQL Fiddle 与此工作

于 2012-09-13T19:10:49.920 回答