【问题标题】:Indexing column with REPLACE function in mySQL在 mySQL 中使用 REPLACE 函数索引列
【发布时间】:2013-08-05 08:07:40
【问题描述】:

可能是一个愚蠢的问题。

我需要在 joinwhere 中大量使用这个:

REPLACE(table_a.column_1, '-', '') = REPLACE(table_b.column_2, '-', '')

由于其他公司系统的位数据不一致

这是否可能或任何其他数据库类型都可以使用 REPLACE 函数对列进行索引?例如:

ALTER TABLE `table_a` ADD INDEX ( REPLACE(`column_1`, '-', '') ) ;

数据库类型:MyISAM

【问题讨论】:

  • 为什么table_a.column_1 = table_b.column_2 在这里不起作用?
  • 我在某处读到,在变量上使用函数不使用索引,也不能在函数上创建索引,因为函数输出未确定,所以,我的答案是否定的
  • @AshwinMukhija 也许他的数据有更多——来自其他公司的数据库然后他们有......
  • @Sumit Gupta 没错,表格来自不同的公司,Sylvain 建议的触发器会做滴答声,谢谢

标签: mysql sql replace indexing myisam


【解决方案1】:

在 MySQL 中没有 computed column 这样的东西。

如果你想格式化一些值来加速索引搜索,你可能不得不使用一些触发器。事实上,我今天早上几乎回答了同样的问题:类似的例子见https://stackoverflow.com/a/18047511/2363712

在你的情况下,这会导致这样的事情:

CREATE TABLE `table_a`(`column_1` VARCHAR(255), ... ,
                       `column_1_fmt` VARCHAR(255),
                       INDEX(`column_1_fmt`));

CREATE TRIGGER ins_table_a BEFORE INSERT ON `table_a`
FOR EACH ROW
    SET NEW.`column_1_fmt` = REPLACE(NEW.column_1, '-', '');

CREATE TRIGGER upd_table_a BEFORE UPDATE ON `table_a`
FOR EACH ROW
    SET NEW.`column_1_fmt` = REPLACE(NEW.column_1, '-', '');

现在您将使用column_1_fmt 搜索值/加入具有所需格式的值。


关于您的特殊需要(从某种序列号/参考号中删除破折号?)。也许你应该扭转这个问题。将这些值存储为规范形式(无破折号)。并在SELECT 时间添加所需的破折号。

【讨论】:

    猜你喜欢
    • 2019-03-25
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2015-08-24
    • 2019-07-15
    相关资源
    最近更新 更多