0

在查询中,我将手机号码与另一列中的另一个(移动)值进行比较。

到目前为止,我正在这样做...WHERE `table_one`.`mobile` != `table_two`.`mobile

问题是有相同的手机号码,但在每一列中用不同的空格分隔,07711 123 456因此07711 123456在匹配时返回结果。

我知道如何在更新期间执行此操作,例如,update `table` set number = REPLACE( number, ' ', '');但我看不到任何在查询中间完成此操作的示例。也许做一个检查,放入一个 MySQL 变量,对附加列中的另一个移动设备做同样的事情,然后比较两个变量?

4

3 回答 3

1

您也可以在选择查询中使用 REPLACE:

select REPLACE( '07711 123 456', ' ', '');
+------------------------------------+
| REPLACE( '07711 123 456', ' ', '') |
+------------------------------------+
| 07711123456                        |
+------------------------------------+
1 row in set (0.06 sec)
于 2013-10-03T10:03:10.470 回答
0

@Nadeem_MK,谢谢。我设法编写了我需要的查询而没有太多努力。

...WHERE (REPLACE(`tbl_one`.`mobile`, ' ', '')) != (REPLACE(`tbl_two`.`mobile`, ' ', ''))

我确实尝试了 TRIM 函数,但我只能设法清除前导或尾随空格,并且使用两个 select 语句,查询比我使用 REPLACE 函数时更长。

于 2013-10-03T10:09:07.540 回答
0

您可以创建一个使用正则表达式仅允许数字的函数。这样,它将删除 + - ( ) 或任何可能的非整数字符

DELIMITER $$

CREATE FUNCTION `fn_ShowOnlyNumbers`(str VARCHAR(1000)) RETURNS varchar(1000) CHARSET latin1
BEGIN
  DECLARE counter INT DEFAULT 0;
  DECLARE strLength INT DEFAULT 0;
  DECLARE strChar VARCHAR(1000) DEFAULT '' ;
  DECLARE retVal VARCHAR(1000) DEFAULT '';

  SET strLength = LENGTH(str);

  WHILE strLength > 0 DO
    SET counter = counter+1;
    SET strChar = SUBSTRING(str,counter,1);
    IF strChar REGEXP('[0-9]') = 1
      THEN SET retVal = CONCAT(retVal,strChar);
    END IF;
    SET strLength = strLength -1;
    SET strChar = NULL;
  END WHILE;
RETURN retVal;
END

然后,您可以简单地在 where 子句中使用该函数。

...WHERE `table_one`.fn_ShowOnlyNumbers(mobile) != `table_two`.fn_ShowOnlyNumbers(mobile)
于 2013-10-03T10:25:07.910 回答