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 来解决,但我对此的了解充其量是薄弱的。

任何帮助表示赞赏。

4

4 回答 4

1

我认为这不适合 SQL 查询。您最好创建第二个表来存储在字符串中找到的标记,以及对父记录的引用。

所以你可以做类似的事情

select record_id from tokens where token_val = 'EFG';

进而

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

基本上,这个想法是预先完成艰苦的工作,每条记录一次,而不是尝试在每次查询时动态解析。

于 2013-02-11T19:50:44.600 回答
1

试试这个:

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

SQL 小提琴演示

于 2013-02-11T19:55:54.273 回答
1

您可以使用正则表达式,但没有必要。只需在搜索词中包含围绕您的值的引号:

select ...
where val like '%\'EFG\'%'
于 2013-02-11T19:57:49.340 回答
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)
  )

在这里看到它。

于 2013-02-11T20:19:11.707 回答