2011-06-14 39 views
0

我使用的是MySQL 5.1.34嵌套查詢,內部LIKE或REGEXP查詢

我想用一個特設的查詢,在那裏我可以嵌套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)%";

我意識到我沒有佔|,在REGEXPOR語句。這包括在這個問題中,我怎麼解釋這個問題呢?

回答

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 */ 
+0

注意:由於LIKE的參數不支持替換,您將無法對LIKE執行相同的操作。 – 2011-06-14 20:54:32

0

嘗試的東西的效果...

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

不能保證正則表達式本身,但這個概念應該工作。 Like也可以以這種方式使用。考慮基於每個dept_id的正則表達式將評估groups.sheets的每個值。

+0

LIKE如何在這裏工作?既然它沒有字界的概念,我敢肯定LIKE'%foo%'不會匹配',foo','foo'。或'(foo)'。我錯過了什麼嗎? – 2011-06-14 21:07:58

+0

詛咒我的隧道視野!我的意思是類似的表達式LIKE可以用在類似的上下文中...如果字面邊界是一個因素,那麼LIKE(在mysql中,無論如何)將是一個糟糕的選擇。 – gibeath 2011-06-15 14:24:32