将varchar转换为仅用于搜索查询的int?

时间:2011-09-14 11:01:44

标签: php mysql

我一直在尝试做的是从表中选择一行,同时将varchar单元格视为int,

这里有一点解释: 我有一个电话号码表,其中一些有“ - ”,有些没有。

我想从数据库中选择一个数字,而不在查询中包含那些“ - ”。 所以我使用了这个preg_replace函数:

$number = preg_replace("/[^0-9]/","",$number); //that leaves only the numbers in the variable

然后我运行以下查询:

"SELECT * FROM `contacts` WHERE `phone` = '{$number}'"

现在,当然它有时候不匹配,因为数字Im搜索在数据库中可能有“ - ”,所以我试图寻找解决方案, 解决方案就是将单元格转换为int,但我对此并不感兴趣,

所以在环顾四周之后,我发现了一个名为CAST的MySQL函数,使用如下:CAST(手机AS UNSIGNED)

我试图弄乱它,但它似乎没有用。

编辑:

我一直在寻找解决方案,并最终使用了MySQL的REPLACE功能。

"SELECT * FROM `contacts` WHERE REPLACE(phone,'-','') = '{$number}'"

谢谢大家的帮助。

3 个答案:

答案 0 :(得分:0)

1。 最简单的方法可能是使用REPLACE运算符。

SELECT * FROM `contacts` WHERE REPLACE(REPLACE(`phone`, '-', ''), ' ', '') = '5550100';

它的作用是简单地用空格替换所有空格和短划线,即删除所有空格和短划线。

2。 解决问题的另一种方法是使用LIKE。如果带有短划线的电话号码的格式与555-0100和555-0199相同,则可以简单地插入%-sign而不是短划线。如果您的号码可能以不同的方式格式化,您可以在每个字符之间插入%。这不是一个漂亮的解决方案,但它可以解决问题。

SELECT * FROM `contacts` WHERE `phone` LIKE '555%0100'; 

SELECT * FROM `contacts` WHERE `phone` LIKE '5%5%5%0%1%0%0';

3。 您可以使用正则表达式。由于MySQL没有实现正则表达式替换函数,因此您需要使用用户定义的函数。看看https://launchpad.net/mysql-udf-regexp。它支持REGEXP_LIKE,REGEXP_SUBSTR,REGEXP_INSTR和REGEXP_REPLACE。

编辑:删除了我的第一个答案,并添加了一些其他选择。

答案 1 :(得分:0)

MySQL不支持提取正则表达式匹配。

您可以尝试编写存储函数来处理它,但最好的办法是将数据转换为整数,以便所有数字都统一。我知道你说你不想要这样做,但是如果你可以,那么它就是最好的事情。否则,您可以执行以下操作:

"SELECT * FROM `contacts` WHERE `phone` = '{$number}' OR `phone` = '{$number_with_dashes}'"

即,用破折号搜索普通数字OR

答案 2 :(得分:0)

我一直在寻找解决方案,并最终使用了MySQL的REPLACE功能。

"SELECT * FROM `contacts` WHERE REPLACE(phone,'-','') = '{$number}'"