2016-11-24 117 views
-2

不敏感的我有這個表"Table"與內容:SQL情況下,搜索

+--------+ 
| Serial | 
+--------+ 
| d100m | <- expected result 
| D100M | <- expected result 
| d200m | <- expected result 
| d300L | 
| D400R | 
+--------+ 

有儲存情況不準確的序列號。

目前,我有一份聲明中選擇有像

SELECT Serial FROM Table WHERE Serial LIKE 'D100M' OR Serial LIKE 'D200M'; 

但不存在,而不是一個簡單的方法OR Serial LIKE OR Serial LIKE OR Serial LIKE有alomst 30號我有比較。

像這樣的事情

SELECT Serial FROM Table WHERE Serial LIKE IN ('D100M', 'D200M') 
+0

'WHERE串行IN( 'D100M', 'D200M')' –

+0

@SalmanA不匹配' d100m' – Toshi

+3

您正在使用哪些DBMS? –

回答

1

最簡單的方法是:

SELECT Serial 
FROM Table 
WHERE upper(Serial) in ('D100M', 'D200M'); 

然而,這不會使用serial列中的索引。

因此,如果性能是一個問題,您需要在upper(serial)上創建索引。

1
SELECT Serial FROM Table WHERE Serial IN ('D100M', 'D200M',<addAllSerialsHereCommaSeparated>) 

UPDATE: 如果所有連續應以大寫字母來檢查,你可以使用:

SELECT Serial FROM Table WHERE upper(Serial) IN ('D100M', 'D200M',<addAllSerialsHereCommaSeparated>) 
+0

雖然這種情況如何不敏感? –

+1

如果我理解正確,不敏感意味着,不需要檢查低位或大寫。所以你可以把所有的字符串都轉換成大寫來檢查,不是嗎? –

+0

強制一個特定的情況下,這意味着你不需要考慮小寫,這是一個非常好的可憐的人不區分大小寫檢查,con是你的檢查需要大寫,但你必須寫他們,所以這是一個非常小的問題 – kyle

0

只要你不使用通配符或其他like運營商的字符,你可以使用這個腳本:

SELECT Serial FROM Table WHERE upper(Serial) IN ('D100M', 'D200M') 

其他明智的,你需要一個全文檢索。

0

我假設你想要忽略案件的記錄。 您可以使用大寫或小寫功能,做一些事情,如:

SELECT Serial FROM Table WHERE Upper(Serial) IN ('D100M', 'D200M') 

或者

SELECT Serial FROM Table WHERE Lower(Serial) IN ('d100m', 'd200m') 
0

使用下面的查詢格式:

select * from dual where upper(DUMMY) in (SELECT upper(x.split_values) 
FROM 
    (WITH T AS 
    (SELECT 'A,B,C,D,E,F' STR FROM DUAL 
) 
SELECT REGEXP_SUBSTR (STR, '[^,]+', 1, LEVEL) SPLIT_VALUES 
FROM T 
    CONNECT BY LEVEL <= 
    (SELECT LENGTH (REPLACE (STR, ',', NULL)) FROM T 
) 
) x 
) 

IN子句中的查詢轉換你的逗號分隔的列表到行... x.split值中的最終選擇被轉換爲上限,然後以列的形式返回。

終於將其提​​供給IN子句作爲一個小型表...

這是甲骨文具體。

在MS SQL的情況下,這鏈路可以是執行相同OPS有用...: http://sqljason.com/2010/05/converting-single-comma-separated-row.html