Mysql很特别喜欢要求

时间:2014-09-09 20:44:07

标签: mysql sql-like

我的情况如下。

我在“productname”列的mysql表中有以下记录。

Adults-Work-Blue-Green-Pink-Ghagra-Choli-Dupatta
Afro-Party-Retro-Wigs-Hair-Black-Curly-Gabbar

现在我想找到以A开头然后在第一个连字符W之后的记录。

如果我按如下所述编写查询,

select DISTINCT Item_Code, Item_Name
from tbl_stock_detail
where Item_Name like 'A%-W%'

它显示了我的两个记录。我想在这里看到第一张唱片,因为在A之后,W是Hyphen之后的第一个字母。同样如果我把它设为'A%-W%-B%',我希望它只显示第一个记录,如'A'之后,'W'是第一个连字符后面的第一个字母,'B'是后面的第一个字母第二个连字符。请记住,有1000种具有各种名称的记录,因此我们无法检查字符串长度。

我可以在mysql中编写这样的查询,也检查序列吗?

对不起,我对Regex不好。这可能是正则表达式。

请告知。

以下编辑问题:

我有这样的记录“Long Skirt red sequin tikli dance” 现在客户说,他想只根据这3个字符进行搜索, R:红色 T:Tikli S:裙子

也是第二件事PLZ。 如果裙子和红色有2个空格而不是1个,我们的旧正则表达式不起作用。但它应该工作,因为他们有时错误地在两个单词之间添加了多个空格。 你能帮我完成这两项要求吗?

更多编辑:

这是静态的,但它在PHP中给了我一些转义序列问题。下面是我的PHP代码,

<?php
$var = 'SRT';
for($i=0;$i<strlen($var);$i++)  
{
    $term = '^'.$var[$i].'|[- ]'.$var[$i];  
    if($i == 0)
        $subquery0 .= " where Item_Name REGEXP '".$term."'";    
    else
        $subquery0 .= " or Item_Name REGEXP '".$term."'";   
}
?>

当我回应$ term时,它只显示'^ S'。 但如果我删除|符号然后它显示完整的字符串。 可能是管道符号需要转义序列我试过它作为'// |'但它不起作用。 对此有任何想法,或者我必须打开一个新问题,因为这是一个PHP问题?

1 个答案:

答案 0 :(得分:2)

正如hjpotter92在他的评论中建议的那样,你应该能够使用正则表达式来定位具有指定匹配的行。

单个LIKE谓词无法执行此类匹配。 (需要了解每个组件的最大长度(“成人”,“工作”等)和整个笨拙的LIKE谓词和所有各种可能长度的组合。我们是不想去那里。)

正则表达无所畏惧。正则表达式可以变得相当复杂,但这就是它们揭示其力量并变得非常有用的地方。


匹配第一个字符是'A'(大写或小写),后面跟一个连字符,紧跟在第一个连字符后面是'W',你可以这样做:

 WHERE Item_Name REGEXP '^A[^-]*-W'

类似地,从A开始,后面(稍后一点)用连字符,紧接着下一个连字符'W',然后(稍后)用另一个连字符和'B'

 WHERE Item_Name REGEXP '^A[^-]*-W[^-]*-B'

让我们一点一点地解开最后一个正则表达式:

<强> ^A

第一个插入符号匹配字符串的开头,字符A匹配字符A(注意:这是与我的数据库连接的不区分大小写的匹配)。所以说,“以A或a开头。”

<强> [^-]*

此部分匹配任何不是连字符的字符数。

<强> -W

此部分匹配后跟W的连字符。(由于前一部分,这将是先前匹配的A之后出现的第一个连字符。)

<强> [^-]*

再次,任何不是连字符的字符(零个或多个)

<强> -B

匹配一个连字符后跟一个连字符B.再次,这将是匹配W的第一个连字符。

字符串的其余部分可以是任何内容。