我有一個包含這樣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
我有一個包含這樣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
假設有什麼可以相對於你的數據做,你可以提取使用REGEXP_REPLACE
這些值:
SELECT id, REPLACE(REGEXP_REPLACE(column_name, '[^-]+ - ?([A-Z]{2},?)', '\1'),
',null', '')
FROM your_table
這裏的工作DEMO。
這工作非常感謝!我從來沒有使用oracle的正則表達式玩過太多......但這會激勵我開始... – cableload
是的,它可以做到。但是有一個很大的but
,SQL是一種查詢語言,並不意味着格式化字符串或使用它們。更好地看待規範化數據庫,因爲將所有數據保存在一列中是一個很好的指標,您仍然有工作要對錶格進行規範化。最好在你的應用程序中完成這項工作,而不是使用sql來完成數據庫。
是的,當然。
select substr(column_name, -2) from table_name
雖然如果你能讓你的數據提供者爲你做,它會更好。
如果數據比指定的數據更髒,並且使用Oracle 10g或更高版本,則可以使用regular expression route,但這似乎並不是必需的。
select regexp_substr('California - CA', '[[:alpha:]]{2}$') from dual;
這裏有一點SQL Fiddle來演示。
請勿將列修改爲您認爲您想要的樣子。將多個值存儲在單個列中是錯誤的。修正數據表一勞永逸:
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'
你在一列中存儲多個值嗎?呸。 – LittleBobbyTables
以及我們不存儲這種方式,而是數據發送給我們......以及我現在不能擔心它.. – cableload