我使用的是MySQL 5.1.34
我想使用Ad Hoc查询,在这里我可以将查询嵌套在LIKE
或REGEXP
语句中。
例如:我有一个表组&床单。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)%";
我意识到我还没有考虑REGEXP
中的|
、OR
语句。这包括在这个问题中,我该如何解释?
尝试一些效果。。。
select groups.* from groups join sheets on name regexp CONCAT("[[:<:]]",dept_id,"[[:>:]]")
不能保证正则表达式本身,但这个概念应该有效。Like也可以用这种方式。考虑groups.sheets的每个值将根据每个dept_id根据正则表达式进行计算。
编辑
假设您试图模拟自定义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 */