2009-09-17 68 views
0
select left(emailaddress, len(emailaddress) - charindex('@', emailaddress)) 

我得到如下結果:如何從字符串[email protected]中提取字符串'foo'?

[email protected] 

請更正以下select語句。我需要用電子郵件地址的語氣來做到這一點,並只提取用戶名。

+0

刪除了您的真實電子郵件,以防萬一,如果我錯了,隨時加回來;沒有意見分享您的電子郵件地址(如果是)垃圾郵件發送者得到:) – 2009-09-17 14:27:00

回答

9

你在不經意間重新實施「右」那裏:)

試試這個:

select left(emailaddress, charindex('@', emailaddress) - 1) 

它尋求@的位置,並採取字符數最多,但不包括(這是- 1@符號。

請注意不具有@的字符串;你會得到一個空字符串。

+0

我不知道,爲什麼-1? charindex給出了一個索引,剩下的長度據我瞭解? – StampedeXV 2009-09-17 14:20:08

+0

Ayup。 Charindex從左開始計數,所以如果你想要字符串的左邊部分,就減去1,這樣你就不會包含搜索字符(@)本身。如果您需要字符串的* right *部分,即*搜索字符後面的*,則只需要字符串的長度。 – Martha 2009-09-17 14:21:05

+0

例如:[email protected] charindex返回1 left([email protected],1)返回 - >我們想要的。所以我們不需要減號1. – StampedeXV 2009-09-17 14:24:20

0

只是一個猜測。我沒有任何訪問sql-server的權限,不熟悉它。但是......

你試過:

select left(emailaddress, charindex('@', emailaddress)) 
+3

這將包括@字符,您需要減去1以獲得所有字符但不包括搜索字符 – Martha 2009-09-17 14:23:00

+0

實際上,這取決於字符串是零索引還是單索引。如果爲零索引,charindex返回3,那麼您會得到3個左邊的字符。基於1的字符串將返回4,因此它將包含'@'。 – 2009-09-17 14:29:35

+0

但是在TransactSQL中,charindex是基於1的!請參閱http://msdn.microsoft.com/en-us/library/ms186323.aspx – 2009-09-17 14:32:04

0
select left(emailaddress, charindex('@', emailaddress)-1) 
1

如果您需要噸做到這一點(或噸,但肯定不是色調)的電子郵件地址和/或你正在做的經常,恰當的時間是數據進入表格(通過使用插入/更新觸發器)並在該點將其分成兩列。這樣,它只會在需要時發生,而不是每次在桌上進行選擇。

數據幾乎是總是讀取的次數比寫入的要多,通過在插入/更新時分割,可以最大限度地減少要完成的工作量。每行函數從不能很好地擴展,因爲表格變得更大,並且簡單連接兩列的成本要比根據字符分隔符分割它們要小得多。

其他答案已經告訴你如何做拆分。我的觀點是你在錯誤的時間做這件事。當然,如果模式更改不在問題中,請忽略此響應。但在我看來,這將是最好的選擇。

相關問題