2012-09-13 172 views
1

我有一個包含這樣SQL查詢字符串基於

 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 
+3

你在一列中存儲多個值嗎?呸。 – LittleBobbyTables

+0

以及我們不存儲這種方式,而是數據發送給我們......以及我現在不能擔心它.. – cableload

回答

3

假設有什麼可以相對於你的數據做,你可以提取使用REGEXP_REPLACE這些值:

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

這裏的工作DEMO

+0

這工作非常感謝!我從來沒有使用oracle的正則表達式玩過太多......但這會激勵我開始... – cableload

2

是的,它可以做到。但是有一個很大的but,SQL是一種查詢語言,並不意味着格式化字符串或使用它們。更好地看待規範化數據庫,因爲將所有數據保存在一列中是一個很好的指標,您仍然有工作要對錶格進行規範化。最好在你的應用程序中完成這項工作,而不是使用sql來完成數據庫。

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來演示。

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