2017-01-11 6 views
1

Предполагая, что у меня есть таблица Table1 таблица в базе данных MySQL. Таблица имеет один столбец под названием string. Вот пример:MySQL REGEXP соответствует строке с тире, которая соответствует строке без штриха

**Table1** 
mytext 
my-text 
some-text 
no-text 
notext 
yes-dash 
yesdash 
no-dash 

Я хочу, чтобы ряды string, из Table1, что соответствует регулярное выражение, которое соответствует только алфавитных символов и один дефис (-).

мне удалось получить, что с

SELECT * FROM Table1 WHERE string REGEXP '^[A-Za-z]+[-]{1}[A-Za-z]+$' 

из приведенного выше примера набора данных, я вернусь

some-text 
my-text 
no-text 
yes-dash 
no-dash 

Теперь, что я действительно хочу, чтобы получить какие-либо string от результата из первый запрос, что, если тире - удалено, эта новая строка NOT есть в Table.

Из примера набора данных, следующий должен быть выходной,

some-text 
no-text 
no-dash 

Любые идеи?

ответ

1

После того, как у вас есть строки, вы можете использовать обычный SQL, чтобы найти строки, которые не имеют, не приборную эквивалент:

SELECT a.* 
FROM Table1 a 
LEFT JOIN Table1 b 
    ON b.string = REPLACE(a.string, '-', '') 
WHERE a.string REGEXP '^[A-Za-z]+-[A-Za-z]+$' 
AND b.string IS NULL 

отметить также упрощение регулярное выражение, потому что [-] идентично только -, а {1} является избыточным (все члены имеют неявный квантификатор одного).

Если вы не знакомы с этой идиомой для поиска не-матчей, он работает, потому что левое соединение всегда возвращает строку, но все столбцы NULL, когда нет соответствующей строки, и где пункт (который стреляет после соединение выполнено) фильтр только для этих строк. Кроме того, вам не нужно беспокоиться о дубликатах, поскольку возвращается только одна строка, когда нет соответствующего соединения.

1

Это кажется любопытным. Но вот один метод:

select t1.* 
from table1 t1 
where not exists (select 1 
        from table1 tt1 
        where tt1.string REGEXP '^[A-Za-z]+[-]{1}[A-Za-z]+$' and 
         t1.string = replace(tt1.string, '-', '') 
       ); 

EDIT:

Я думаю, что выше делает обратный (возвращая unhyphenated версию). Это легко исправить:

select t1.* 
from table1 t1 
where t1.string REGEXP '^[A-Za-z]+[-]{1}[A-Za-z]+$' and 
     not exists (select 1 
        from table1 tt1 
        where tt1.string = replace(t1.string, '-', '') and 
         tt1.string not like '%-%' 
       );