基于sql查询字符串

时间:2012-09-13 18:53:16

标签: sql oracle

我有一个包含此类数据的列

     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 个答案:

答案 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'

SQL Fiddle with this working