2013-02-11 151 views
1

这是我正在处理的一个非常简化的版本,但希望它能够得到我的观点。选择字符串,其中包含

我有一个MySQL表,它看起来是这样的:

CREATE TABLE Table1(
    ID INT AUTO_INCREMENT, 
    Val VARCHAR(50), 
    PRIMARY KEY (id) 
); 
INSERT INTO Table1 (Val) SELECT "Reference.Int('ABCD')"; 
INSERT INTO Table1 (Val) SELECT "Reference.Str('EFG','ABC')"; 
INSERT INTO Table1 (Val) SELECT "Reference.Int('HIJ','EFG','ABC')"; 

的方法我正在接收的参数在括号中的一个值,例如:“EFG”。是否有可能抓住表中包含此值的所有行。我知道,如果我这样做:

SELECT * from Table1 where Val LIKE "%EFG%" 

我能得到正确的价值观,我的问题是,我需要更具体的,因为例如值可以是这个样子:

Reference.Int('ABCD') + EFGX/200 

EFG + anything else 

意思是说我需要以某种方式包括这部分也: “Reference.Str()”。我并不关心括号中的其他内容,我唯一的担心是获取包含我接收的参数值的那些。

我想知道是否可以通过使用REGEXP来解决这个问题,但我的这方面的知识充其量是最好的。

任何帮助表示赞赏。

+0

我不明白这个问题。为什么'Val LIKE'%EFG%“'不够? – ruakh 2013-02-11 19:49:10

+0

@ruakh:考虑以下值“参考。Int('EGFGASDSFSDGF')“ – 2013-02-11 19:51:25

+0

所以会像”%'EFG'%“更好吗? – MadProgrammer 2013-02-11 19:52:51

回答

1

您可以使用正则表达式,但没有必要。只是包括在搜索项周围的值引号:

select ... 
where val like '%\'EFG\'%' 
+0

谢谢大家的回答,以及耐心的回答,愚蠢 – DVM 2013-02-11 20:19:02

1

我不认为这是一个很好的SQL查询。您可能最好创建另一个存储在字符串中找到的令牌的表,并返回父记录的引用。

所以你可以做这样的事情

select record_id from tokens where token_val = 'EFG'; 

然后

select * from records where record_id in (*results from pervious query) 

基本的想法是做的辛勤工作了前面,一旦每个记录,而不是试图在飞行解析在每个查询上。

1

试试这个:

SELECT * FROM Table1 WHERE Val LIKE "Reference.Str(%'EFG'%" 

SQL FIDDLE DEMO

+0

这将工作,如果只有“Reference.Str”,但有几个更多的变种,谢谢你的答案仍然 – DVM 2013-02-11 20:20:10

+0

@DanielV对不起,我的错误,你必须得到共同的部分。 ''Reference.'你可以使用下面的语句:'SELECT * FROM Table1 WHERE Val LIKE'Reference。%(%'EFG'%)%“' – 2013-02-11 20:25:33

1

我认为你可以使用SUBSTRING_INDEX只得到括号中的字符串的一部分:

SUBSTRING_INDEX(SUBSTRING_INDEX(Val, "(", -1), ")", 1) 

,然后你可以使用FIND_IN_SET

SELECT * 
FROM Table1 
WHERE 
    FIND_IN_SET(
    '\'EFG\'', 
    SUBSTRING_INDEX(SUBSTRING_INDEX(Val, "(", -1), ")", 1) 
) 

查看它here

相关问题