2017-08-09 3 views
-1

私の作品に関連するラベルの属性フィールドがあります。私はこのフィールド内で重複を探しています。問題は、入力が矛盾しているということです。たとえば:特殊文字を無視して、列内に重複しない値を見つける方法はありますか?

Group | Label | 
--------------- 
1  | H7  | 
1  | H-7 | 
2  | C9  | 
2  | C 9 | 
3  | D5  | 
3  | M 9 | 

私が探していた結果がちょうどである:これらのよう

3  | D5  | 
3  | M 9 | 

は、互いに本当に異なっています。現在、次のクエリを使用しています:

SELECT * 
FROM TABLE t3 
WHERE t3.group IN (
    SELECT t1.group 
    FROM TABLE t1, TABLE t2 
    WHERE t1.group = t2.group 
    AND (t1.label <> t2.label) 

特殊文字を無視するようにクエリを取得するにはどうすればよいですか?

答えて

1

あなたはregexp_replace()を使用することができます。

SELECT t.* 
FROM TABLE t 
WHERE NOT EXISTS (SELECT 1 
        FROM TABLE tt 
        WHERE tt.group = t.group AND tt.rowid <> t.rowid AND 
         regexp_replace(tt.label, '[^a-zA-Z0-9]', '') = regexp_replace(t.label, '[^a-zA-Z0-9]', '') 
       ); 

これはシングルトンであるすべての元の行を返す必要があります。

SELECT t.* 
FROM TABLE t 
WHERE t.group IN (SELECT tt.group 
        FROM (SELECT tt.group, regexp_replace(tt.label, '[^a-zA-Z0-9]', '') as label_clean, COUNT(*) as cnt 
         FROM TABLE tt 
         GROUP BY tt.group, regexp_replace(tt.label, '[^a-zA-Z0-9]', '') 
         ) tt 
        GROUP BY tt.group 
        HAVING MAX(cnt) = 1 
       ); 
2

「特別な」の文字が、あなたはregexp_replaceを使用することができ、英数字文字以外何もすることができた場合:

select max(t.group), max(t.label) 
from your_table t 
group by regexp_replace(t.label, '[^[:alnum:]]', '') 
having count(*) = 1; 

、値で可能な特殊文字の数は限られ、おそらく非がある場合 - replaceを使用して "regexp"ソリューションが動作します。

また、識別子として「グループ」などのキーワードを使用しないでください。

+0

が表示されます、あなたはすべてのシングルトンているグループのすべての行をしたい場合)regexp_replace(regexp_replace(label、 '[^ [:alnum:]]'、 '') – tbone

+0

@tbone - スペースは特殊文字と見なされています。例えば。 "C9"と "C9"は同じとみなされる。 – GurV

2

試してください::; -

select regexp_replace(label,'[^[:alnum:]]',''), count(1) cnt 
from some_table 
group by regexp_replace(label,'[^[:alnum:]]','') 
having count(1) > 1 

これはそれに私を打つ(のみ英数字に基づいて)重複ラベル

関連する問題