嵌套查询,在LIKE或REGEXP查询中

时间:2011-06-14 19:36:58

标签: mysql regex

我正在使用MySQL 5.1.34

我想使用Ad Hoc查询,我可以在LIKEREGEXP语句中嵌套查询。

例如:我有一个表格组&床单。 dept_id是组的外键。

SELECT * FROM groups WHERE name REGEXP "[[:<:]](SELECT DISTINCT dept_id FROM sheets)[[:>:]]";

SELECT * FROM groups WHERE name like "%(SELECT DISTINCT dept_id FROM lotnumqcs)%";

我意识到我没有考虑|中的ORREGEXP语句。这包含在这个问题中,我该如何解释?

2 个答案:

答案 0 :(得分:0)

我可能会遗漏一些重要的东西,但我很确定你不能做你希望的事情......

修改

假设您正在尝试模拟您定制的SELECT语法所描述的功能,您可以尝试:

/* 
   set @options to regex sequence group of distinct values of sheets.dept_id

   note: for completeness, each value should be properly escaped per regex rules.
*/

SET @options=CONCAT('[[:<:]](',(
      SELECT GROUP_CONCAT(did SEPARATOR '|') 
      FROM (SELECT DISTINCT dept_id AS did FROM sheets) AS sheetsa
),')[[:>:]]');

SELECT * FROM groups WHERE name REGEXP @options;

我使用以下方法成功测试过:

CREATE TABLE t1 (a int, b int);

INSERT INTO t1 (a,b) VALUES (0,0),(0,1),(1,0),(1,1);

SET @options=CONCAT( '[[:<:]](', ( 
      SELECT GROUP_CONCAT(tb SEPARATOR '|') 
      FROM (SELECT DISTINCT b AS tb FROM t1) AS ta
), ')[[:>:]]' );

SELECT @options; /* '[[:<:]](0|1)[[:>:]]' */

SELECT '0' REGEXP @options;            /* 1 = true  */

SELECT '1' REGEXP @options;            /* 1 = true  */

SELECT '2' REGEXP @options;            /* 0 = false */

SELECT ' a ba 1 c d ' REGEXP @options; /* 1 = true  */

SELECT ' a ba1c d' REGEXP @options;    /* 0 = false */

SELECT ' a ba 1c d' REGEXP @options;   /* 0 = false */

SELECT ' a ba1 c d' REGEXP @options;   /* 0 = false */

SELECT ' a ba 2 c d' REGEXP @options;  /* 0 = false */

答案 1 :(得分:0)

尝试一下......的效果。

select groups.* from groups join sheets on name regexp CONCAT("[[:<:]]",dept_id,"[[:>:]]")

不能保证正则表达式本身,但这个概念应该有效。喜欢也可以这种方式使用。考虑group.sheets的每个值将根据每个dept_id的正则表达式进行评估。