如何将MySQL正则表达式翻译成Postgres?

时间:2013-12-23 21:05:00

标签: mysql regex postgresql pdo

  1. 我有这样的MySQL查询:
  2. '... WHERE    
        LOWER(users.name) REGEXP LOWER(" '.$q.'") OR
        LOWER(users.name) REGEXP LOWER("^'.$q.'") OR
        LOWER(users.login) REGEXP LOWER("'.$q.'") OR 
        links.lv REGEXP LOWER("'.$q.'+")'
    

    我需要在PostgreSQL和PDO中准备相同的条件。我正在尝试使用regexp_matches(),但它不适用于PDO。

2 个答案:

答案 0 :(得分:2)

如果您坚持修复正则表达式,则需要出现错误消息,但我猜测Postgres正在吐出未找到列的错误或者该订单中的某些内容,如果您的原始查询是任何内容。原因是你使用的是双引号;这些用于引用Postgres中的标识符,其方式与MySQL中的反引号相同。

另请注意,Postgres提供的内容比您尝试使用全文搜索形式发布的查询更好。为了说明,你可以使用类似的东西:

...
where (setweight(to_tsvector(coalesce(users.name,  '')), 'A') ||
       setweight(to_tsvector(coalesce(users.login, '')), 'B') ||
       setweight(to_tsvector(coalesce(users.bio,   '')), 'D') ||
       setweight(to_tsvector(coalesce(links.lv,    '')), 'B')
      ) @@ plainto_tsquery(:query)

http://www.postgresql.org/docs/current/static/textsearch.html

答案 1 :(得分:2)

你还没有向我们展示$q是什么,所以你很难猜到你想要做什么。如果它是正则表达式,你可以做类似的事情:

WHERE    
    LOWER(users.name) ~ :q OR
    LOWER(users.name) ~ :q OR
    LOWER(users.login) ~ :q OR 
    links.lv ~ :q

其中:q占位符变量,您将其作为命名查询参数传递。请参阅PDO::Prepare

我强烈怀疑您的$q实际上只是.*somestring.*,即您只是在进行中缀模式搜索。如果是这种情况,您最好使用LIKE而不是MySQL REGEXP或PostgreSQL ~并使用模式%somestring%

不要像上面那样将文字直接插入到SQL中

Bobby Tables

如果$q"); DROP TABLE users; --会怎样?哎呀!请阅读: