[英]SQL Case insensitive IN search
我有此表"Table"
,其內容為:
+--------+
| 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
還有沒有更簡單的方法,我必須比較30個數字。
像這樣
SELECT Serial FROM Table WHERE Serial LIKE IN ('D100M', 'D200M')
最簡單的方法是:
SELECT Serial
FROM Table
WHERE upper(Serial) in ('D100M', 'D200M');
但是,這不會在serial
列上使用索引。
因此,如果要考慮性能,則需要在upper(serial)
創建一個索引。
SELECT Serial FROM Table WHERE Serial IN ('D100M', 'D200M',<addAllSerialsHereCommaSeparated>)
更新:如果應該大寫檢查所有序列號,則可以使用:
SELECT Serial FROM Table WHERE upper(Serial) IN ('D100M', 'D200M',<addAllSerialsHereCommaSeparated>)
只要您不使用通配符或其他like
運算符的字符,就可以使用以下腳本:
SELECT Serial FROM Table WHERE upper(Serial) IN ('D100M', 'D200M')
否則,您需要全文搜索。
我假設您想不考慮案件而獲得記錄。 您可以使用上層或下層功能並執行以下操作:
SELECT Serial FROM Table WHERE Upper(Serial) IN ('D100M', 'D200M')
要么
SELECT Serial FROM Table WHERE Lower(Serial) IN ('d100m', 'd200m')
使用以下查詢格式:
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子句...
這是Oracle特定的。
如果是MS SQL,此鏈接對於執行相同的操作可能很有用...: http : //sqljason.com/2010/05/converting-single-comma-separated-row.html
您可以檢查以下內容:
SELECT Serial
FROM Table
WHERE (Serial collate SQL_latin1_general_cp1_cs_as)
IN ('D100M', 'D200M', 'd200m');
它應該獲得正確和所需的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.