2013-02-11 2 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

+0

@ruakh: Рассмотрим следующее значение «Ссылка.Int ('EGFGASDSFSDGF') « –

+0

Так понравилось бы«% »EFG«% »быть лучше? – MadProgrammer

ответ

1

Вы можете использовать регулярное выражение, но нет никакой необходимости. Просто включите кавычки вокруг ваши ценности в термине поиска:

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

спасибо всем за ваши ответы и за терпение с вопросом, который, вероятно, очень глупый – DVM

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

+0

@DanielV Извините, моя ошибка. Вы должны получить общую часть. Если все начинается с '' Reference.' вы можете использовать это: 'SELECT * FROM Table1 WHERE Val LIKE" Ссылка.% (% 'EFG'%)% "' –

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.