sql复杂,如表达式@user

时间:2009-12-02 20:11:31

标签: sql mysql database expression

我试图从数据库文本代码中找到匹配用户名(sam)的所有提及,如下所示:

$sql = "select * from tweet where feed like '%@sam%'";

这将返回用户提到的所有行。

但现在的问题是,它还会返回@ sam3,@ sam-dadf或@sam之后的任何行。

我该怎么限制这个,所以只有特定的用户名显示在文本而不是所有匹配的sams ..以下是数据库中的文本格式,插入到Feed行中。

 1. i been out with @sam today, but im
    not sure what we should do
 2. we head great party today and all the frineds were invited, such as @sam, @jon, @dan...
 3. i been out today with @samFan and with @dj. << this row should not get pull from database``

4 个答案:

答案 0 :(得分:1)

我建议使用mysql正则表达式来尝试实现此目的。

搜索字符串s以查找所需的文本,忽略所选的后续字符

MySQL Regular Expressions

答案 1 :(得分:1)

是的,使用REGEXP(或RLIKE),但请注意寻找所需“令牌”结尾的常见正则表达式错误,因为它只是一个常见的,否定的字符类,如{{ 1}} - 而是使用零宽度,“词尾”匹配构造[^A-Za-z0-9](perl的引擎和其他灵感的regexen称为[[:>:]])。

否定的字符类在字符串结尾处无法匹配:

\b

字边界匹配成功:

mysql> SELECT 'I am @sam' REGEXP '@sam[^A-Za-z0-9]' AS "Does This Match?";
+------------------+
| Does This Match? |
+------------------+
|                0 | 
+------------------+
1 row in set (0.00 sec)

如果mysql> SELECT 'I am @sam' REGEXP '@sam[[:>:]]' AS "Does This Match?"; +------------------+ | Does This Match? | +------------------+ | 1 | +------------------+ 1 row in set (0.00 sec) 不适合您的应用程序(因为您的“用户名”字符集不是MySQL正则表达式引擎认为是您的语言环境中单词边界的一侧),您可以选择,指定一个否定的字符类,并分别测试字符串结尾:

[[:>:]]

答案 2 :(得分:0)

对不起,但我不熟悉MySql。

在Microsoft SQL Server中,Like子句可以允许您指定不匹配的字段。

例: if('我喜欢@Spam。'LIKE'%@ Spam [^ a-z]%')SELECT 1

答案 3 :(得分:0)

从表格中选择*,其中Feed REGEXP'@ sam [^ A-Za-z0-9]'