2017-01-11 16 views
1

MySQLデータベースにテーブルTable1があるとします。このテーブルには、stringという単一の列があります。MySQL REGEXPの文字列と、ダッシュのない文字列と一致するダッシュが一致する

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

私は唯一のアルファ文字と単一のダッシュ(-)にマッチする正規表現にマッチTable1から、stringの行を取得したい:ここでは一例です。

は、私は上記の例のデータセットから

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

で、私は今、バック

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

を取得することを得ることができ、私が本当に取得したいことの結果から、いずれかのstringですダッシュ-が削除された場合、その新しい文字列はではなく、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}は冗長です(すべての項には暗黙の限定子が1つあります)。

あなたは非マッチを見つけるためのこのイディオムに慣れていない場合は、左必ず参加するので、それが動作するには、行を返しますが、一致する行がありませんときに、すべての列がNULLあり、そして後を発射WHERE句(結合が行われます)。また、一致する結合がないときに返される行が1行しかないので、重複を心配する必要はありません。

1

これは好奇心のようです。私は上記の(unhyphenatedバージョンを返す)を行いだと思う

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:しかし、ここでは一つの方法です。これは、簡単に固定されている:あなたが行を持って

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 '%-%' 
       );