2013-07-10 46 views
1

我正在使用一個有FNN列(完整國家編號)的數據庫。在澳大利亞,所有的FNN都是10位數字,從0開始,然後是一位數的州編號,然後是8位數的電話號碼。MySQL - 將0連接到所有列值(如果沒有0開始)

目前,有一半的條目只有9位數字,這意味着排在第一位的是0,但另一半隻有10位數。

我想將0連接到沒有0開頭的所有列值。以下是我嘗試的當前查詢,但結果爲0。

UPDATE SUBSCRIBERS SET FNN=concat('0',FNN) WHERE FNN LIKE '[1-9]%'; 

國家數字不以0開頭,所以我只需要連接一個0,其中第一個數字在1-9之間。爲什麼不是上述查詢工作?

謝謝。

問候,

馬特

回答

1

在你提到你的問題其中一些有9位數字,而另一半有10位數字,所以我建議不要查找FNN以1-9開頭的行,爲什麼不尋找具有FNN = 9位數的行?

UPDATE SUBSCRIBERS 
SET FNN=concat('0',FNN) 
WHERE CHAR_LENGTH(FNN) = 9; 
+0

也是很好的答案,這裏的每個答案都是有效的和有效的。謝謝。 – Matt

+0

這會慢很多,因爲它必須掃描表並計算每個字符串的長度。 – Curt

1

這是不完全正確。

首先,MySQL不支持LIKE'[1-9]'字符類約定。這是一個SQL Server的事情。

這樣做的最簡單的方法是很醜陋,但它聽起來像一個一次性的交易:

UPDATE Subscribers SET fnn = concat('0', fnn) WHERE fnn LIKE '1%' 
UPDATE Subscribers SET fnn = concat('0', fnn) WHERE fnn LIKE '2%' 
UPDATE Subscribers SET fnn = concat('0', fnn) WHERE fnn LIKE '3%' 
UPDATE Subscribers SET fnn = concat('0', fnn) WHERE fnn LIKE '4%' 
    <etc> 
+0

非常感謝,謝謝。將在3分鐘內標記爲最佳。 – Matt

2

也許你可以使用not like

UPDATE SUBSCRIBERS SET FNN=concat('0',FNN) WHERE FNN NOT LIKE '0%'; 
+0

這是一個更優雅,我所建議的。 – Curt

0

好像很多工作答案在這裏,但你可以用完全消除WHERE條款:

UPDATE SUBSCRIBERS 
SET FNN = RIGHT(concat('0',FNN),10)