2017-08-09 40 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

此外,請避免使用「group」等關鍵字作爲標識符。

+0

打我給它; - )我會在regexp_replace tho中引入一個空格: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 

這將顯示重複的標籤(基於字母數字只)