2014-01-15 3 views
0

У меня есть ограничение на использование функции FIND_IN_SET MySQL для поиска массива в наборе. Следовательно, думаем об использовании REGEXP. Однако кто-нибудь может помочь мне его построить.MySQL: использование 'REGEXP' вместо 'FIND_IN_SET'

E.g. Мое требование

SELECT * FROM table AS t WHERE FIND_IN_SET('1,2,3', t.list);

Поэтому думать об использовании функции REGEXP для поиска массива в наборе.

SELECT * FROM table AS t WHERE t.list REGEXP '1,2,3';

Может кто-нибудь помочь мне строить этот REGEXP.

+0

попробовать это 'SELECT * FROM таблицы AS т ГДЕ t.list REGEXP {1,2,3}' –

+0

Я попытался это, но безрезультатно. –

+0

Я отправил ответ попробовать, что –

ответ

1

Вы можете сделать так:

SELECT * FROM table AS t WHERE t.list REGEXP '^9,|,9$|,9,' OR t.list =9 
0

Для ваших требований вы можете легко использовать:

SELECT * 
FROM table1 AS t 
WHERE t.list REGEXP '1|2|3'; 

Чтобы узнать о регулярных выражениях принять смотреть на это программное обеспечение: http://www.weitz.de/regex-coach/

+0

Да, я думал о той же строке, однако '|' будет соответствовать шаблону EITHER OR. Есть ли способ гарантировать, что все значения присутствуют. –

1

You может разделить строку поиска и продолжать использовать FIND_IN_SET()

SELECT * 
    FROM `table` AS t 
WHERE FIND_IN_SET('1', t.list) 
    AND FIND_IN_SET('2', t.list) 
    AND FIND_IN_SET('3', t.list) 

Лучше нормализуйте свои данные, введя таблицу «многие ко многим».

+0

Я думал об использовании 'FIND_IN_SET' таким образом, но для увеличения числа функций и времени требуется дополнительное кодирование вне MySQL. –

+0

И это сделает запрос как тяжелый вес, если, например, я столкнулся с ситуацией, требующей, чтобы я соответствовал 500 значениям, не является ли «REGEXP» подходящим решением? –

+0

Вся тяжесть вызвана неправильным дизайном. REGEXP не сделает его легче для вас. REGEXP в этом случае не будет лучше, и вам все равно нужно разделить строку запроса. В обоих случаях вы всегда вызываете полное сканирование на своем столе. Если вам нужно сопоставить 500 значений, чем создать временную таблицу, вставьте эти значения и присоединитесь к своей таблице с помощью 'FIND_IN_SET()'. Но снова то, что вы действительно должны делать, это нормализовать вашу схему. – peterm

0

попробовать заявление парование SQL:

SELECT * 
FROM table AS t 
WHERE t.list REGEXP '^(1$|2$|3$)'; 
+0

, а не результата –

+0

, что t.list содержит?? –

+0

содержит такие значения, как '1,2,3,4,5,6,7' –

Смежные вопросы