0

考虑以下数组:

"Bank of America"    => "BOA",
"Microsoft"          => "MSFT",
"Berkshire Hathaway" => "BRK"

实际上,该阵列有 100 对长。如果我有一个带有文本记录的 MySQL 表“字符串”:

str_id  str_text
-------------------------------------------------------------
1       I wish I had bought Berkshire Hathaway in the 1980's!
2       Microsoft to release Windows 8 in 4 flavours

有没有办法 - 在 SQL 中!- 遍历所有数百万条记录并用他们的股票代码替换所有公司名称?这样当查询完成时,字符串表看起来像这样?

str_id  str_text
-------------------------------------------------------------
1       I wish I had bought BRK in the 1980's!
2       MSFT to release Windows 8 in 4 flavours

我在问,因为它可以使用 PHP,但这本质上会更慢,因为我必须检索几千条记录,循环它们,更新它们,使用 crontab 检索数千条记录,等等。

4

2 回答 2

2

没有 PHP 的替代方案(仅限 MySQL):

创建 MySQL 过程:

    DELIMITER // 
    DROP PROCEDURE IF EXISTS replace_strings// 
    CREATE PROCEDURE replace_strings(IN table_name VARCHAR(100), IN field_name VARCHAR(100))

    BEGIN

    DECLARE done INT DEFAULT FALSE;
    DECLARE str_from VARCHAR(255);
    DECLARE str_to VARCHAR(255);
    DECLARE cur1 CURSOR FOR SELECT string_from, string_to FROM replacements;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur1;

    read_loop: LOOP
        FETCH cur1 INTO str_from, str_to;
        IF done THEN
            LEAVE read_loop;
        END IF;

    SET @sql_command = CONCAT("UPDATE ",table_name," SET ",field_name," = REPLACE(",field_name,", '",str_from,"', '",str_to,"')");
    PREPARE stmt FROM @sql_command;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    END LOOP;

    CLOSE cur1;

    END // 
    DELIMITER ;

创建replacements带有字段string_from和的表string_to。向此表添加可能的自动更改。

在您的代码中使用过程调用:

    CALL replace_strings('strings','str_text');
于 2013-02-22T11:42:02.647 回答
1

为什么不使用 REPLACE 功能?

update 
  mytable 
set 
  str_text=replace(str_text, 'Bank of America', 'BOA');

所以你应该遍历你的数组并执行那个 sql 请求:

foreach ($myarr as $key=>$val) {
//exec sql
}
于 2012-04-17T17:12:38.110 回答