2010-04-16 23 views
2

我想在一個MYSQL表中創建一個新的列,它具有Fn Ln而不是Ln,Fn。我的大部分數據都是打印的Fn Ln。如何在具有數據結構的mysql中翻轉列:'姓氏,名字'?

另一個想法是在每次輸出(基於php)時都包含一個字符串函數,但似乎浪費資源。最後,我無法找到我的PHP函數的語法(循環或foreach)。

這裏是工作的PHP函數,我從以前的帖子有:

$name = "Lastname, Firstname"; 
    $names = explode(", ", $name); 
    $name = $names[1] . " " . $names[0]; 
+0

建議您不要將全名存儲在一列中。無論您使用姓氏還是姓氏,名字,這都是不好的做法。 實際上解析這些並不容易,因爲名稱中有空格,有時逗號不是拼寫首字母和姓氏的字母。該計劃如何知道如何扭轉Linda Sue De La Rosa或Smith,MD,John A.或Miller,Steve,III。以這種方式存儲的數據不可避免地會變得雜亂無章。另外,它很難查詢。始終將名字中間名姓和後綴分爲特殊字段。 – HLGEM 2010-04-16 17:42:17

回答

3

你可以使用mysql函數SUBSTRING_INDEX獲取一個字符串的一部分直到指定的一個或多個事件。

你想要什麼叫

# Add new column 
alter table $TABLE add $newField varchar(40); # or something like that 

# Populate new data 
update $TABLE set $newField = CONCAT(
    SUBSTRING_INDEX(SUBSTRING_INDEX($oldField,',',2),',',-1), 
    ' ', 
    SUBSTRING_INDEX($oldField,',',1) 
); 

其將在名稱字段,並把第二部分首先,在您創建的新領域確保任何我以$前綴改變。

+0

+1爲什麼這是低調? – 2010-04-16 17:07:26

+1

以前它的格式很差,並且不包含MYSQL函數的鏈接,這是我的猜測。 – kbenson 2010-04-16 17:08:58

+0

幹得好!結果:在2.5秒內受影響的行數爲163,600行 – 2010-04-16 17:16:15

2

看一看使用

SUBSTRING_INDEX(str,delim,count)

RIGHT(str,len)

而且

LEFT(str,len)

CONCAT(str1,str2,...)

另外,爲什麼都存儲在單個列這些領域擺在首位?如果將它們存儲在正確的Fields FirName中,並將單獨的LastName字段存儲起來,會不會更容易?

林更多的是SQL Server的一個位,但你可以嘗試像

SELECT CONCAT(RIGHT(FirstNameLastName,LEN(FirstNameLastName) - SUBSTRING_INDEX(FirstNameLastName, ' ', 1)), 
       ', ', 
       LEFT(FirstNameLastName,SUBSTRING_INDEX(FirstNameLastName, ' ', 1) - 1) 
       ) 
FROM YourTable 

編輯:

SQL服務器會看起來像(利息的緣故)

DECLARE @Table TABLE(
     FirstNameLastName VARCHAR(100) 
) 

INSERT INTO @Table SELECT 'Foo Bar' 

SELECT RIGHT(FirstNameLastName,LEN(FirstNameLastName) - PATINDEX('% %', FirstNameLastName)) + ', ' + LEFT(FirstNameLastName,PATINDEX('% %', FirstNameLastName) - 1) 
FROM @Table 
+0

是的,你是正確的存儲作爲兩個領域的效率。但是我從退出軟件導入數據,這就是它存儲的方式。我會看看你的鏈接。 – 2010-04-16 16:55:50

+1

那麼,@ggg?他正在談論你目前的數據庫。現在把它變成2個字段,因爲無論如何你都在改寫它。這是關鍵,而不是你的舊軟件 – 2010-04-16 16:59:39

相關問題