SQL不区分大小写的搜索

时间:2016-11-24 09:09:00

标签: sql sql-like

我有这个表"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')

6 个答案:

答案 0 :(得分:4)

最简单的方法是:

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

然而,这不会在serial列上使用索引。

因此,如果需要考虑性能,则需要在upper(serial)上创建索引。

答案 1 :(得分:2)

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

更新: 如果应以大写形式检查所有序列号,则可以使用:

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

答案 2 :(得分:1)

只要您不使用通配符或其他like运算符字符,就可以使用此脚本:

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

另外,您需要全文搜索。

答案 3 :(得分:1)

我假设您想要忽略大小写来获取记录。 您可以使用大写或小写功能,并执行以下操作:

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

或者

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

答案 4 :(得分: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值中的最终选择将转换为upper,然后作为列返回。

最后它作为迷你表提供给IN子句......

这是Oracle特定的。

在MS SQL的情况下,此链接可能对执行相同的操作有用...: http://sqljason.com/2010/05/converting-single-comma-separated-row.html

答案 5 :(得分:0)

您可以检查以下内容:

SELECT Serial
FROM Table
WHERE (Serial collate SQL_latin1_general_cp1_cs_as)
      IN ('D100M', 'D200M', 'd200m');

它应该获得正确和所需的信息。