簡體   English   中英

SQL不區分大小寫的IN搜索

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM