2011-11-08 5 views
1

残念ながらタイトルが貧弱ですが、別の方法で記述することはできませんでした。私がする必要があるのは、列の特定のエントリに接頭辞を追加することです。エントリにプレフィックスを追加するためにmysql update helpが必要

たとえば、列には92209.1,92201,1,92202,1などのような番号の項目があります。接頭辞を付けずに数字だけに接頭辞を追加する必要があります。 92209.1はTMP92201,1となる。

私はUPDATE関数の使い方を知っていますが、このタイプのクエリでは使い方がわかりません。私はあなたが提供できるあらゆる助けに感謝します。おかげ

+0

してくださいあなたの記事を編集して、そこに改行を追加して読めるようにします。あなたがしたいことの例を提供してください。 – Romain

+0

これは1回限りの問題ですか?そのため、パフォーマンスに大きな問題はありません(つまり、0.1秒、1秒、10秒のどちらにしても問題ありません)。 – VolkerK

+0

@VolkerK 1回。時間は問題ではありません。ありがとう – bollo

答えて

4

あなたはの線に沿ってステートメントを使用する必要があります。基本的に

UPDATE TABLE_NAME SET FIELD_NAME = CONCAT('TMP', RIGHT(FIELD_NAME, LENGTH(FIELD_NAME) - 7)) WHERE FIELD_NAME LIKE '92209.1%' 

、それがテーブルからFIELD_NAMEという名前のフィールドの値を変更しますが'92209.1'で始まるFIELD_NAMEを持っているすべての行に対してTABLE_NAMEと呼ばれます。設定される値は、'TMP'と接頭辞のサイズの左の部分(7文字)を削除したFIELD_NAMEの値を連結して得られます。

+0

ロメイン。この声明を説明してください。ありがとう – bollo

+0

答えに説明を追加しました。 – Romain

+0

説明ありがとうございました – bollo

4

のは、テーブル

CREATE TEMPORARY TABLE soFoo (
    id int auto_increment, 
    v varchar(32), 
    primary key(id) 
) 
を想定してみましょう

あなたは

SELECT 
    * 
FROM 
    soFoo 
WHERE 
    v NOT LIKE 'TMP%' 

経由接頭辞なしvを持つすべての行を選択することができますし、行のみに影響を与えるにWHERE句同じで更新クエリを制限することができますプレフィックスのないvがあります。

UPDATE 
    soFoo 
SET 
    ... 
WHERE 
    v NOT LIKE 'TMP%' 

今、あなたはあなたの静的な文字列リテラル

SET 
    v = CONCAT('TMP', v) 

完全なクエリで始まる彼らの現在の値にそれらのv秒を設定したい:

UPDATE 
    soFoo 
SET 
    v = CONCAT('TMP', v) 
WHERE 
    v NOT LIKE 'TMP%' 

自己完結型の例:

<?php 
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
setup($pdo); 

echo "before:\n"; 
foreach($pdo->query("SELECT * FROM soFoo", PDO::FETCH_ASSOC) as $row) { 
    echo join(' | ', $row), "\n"; 
} 

$query = " 
    UPDATE 
     soFoo 
    SET 
     v = CONCAT('TMP', v) 
    WHERE 
     v NOT LIKE 'TMP%' 
"; 
$pdo->exec($query); 

echo "\n\nafter:\n"; 
foreach($pdo->query("SELECT * FROM soFoo", PDO::FETCH_ASSOC) as $row) { 
    echo join(' | ', $row), "\n"; 
} 

function setup($pdo) { 
    $pdo->exec('CREATE TEMPORARY TABLE soFoo (
     id int auto_increment, 
     v varchar(32), 
     primary key(id) 
    )'); 

    $stmt = $pdo->prepare('INSERT INTO soFoo (v) VALUES (:v)'); 
    $stmt->bindParam(':v', $v); 
    // add some rows with and some without the prefix 
    for($i=0; $i<20; $i++) { 
     $v = rand(1000, 10000); 
     if (0==$v%2) { 
      $v = 'TMP'.$v; 
     } 
     $stmt->execute(); 
    } 
} 
関連する問題