SQL IN 搜索不区分大小写

SQL Case insensitive IN search

我有这个 Table "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 Serial IN ('D100M', 'D200M',<addAllSerialsHereCommaSeparated>)

更新: 如果要检查所有连续剧的大写字母,可以使用:

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

最简单的方法是:

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

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

因此,如果性能是一个问题,您需要在 upper(serial).

上创建索引

只要不使用通配符或其他like运算符,都可以使用这个脚本:

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

否则,您需要进行全文搜索。

我假设你想在忽略大小写的情况下获取记录。 您可以使用 upper 或 lower 函数并执行以下操作:

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 值中的最终选择被转换为上限,然后作为列返回。

最后它作为一个迷你 table...

提供给 IN 子句

这是 Oracle 特定的。

在 MS SQL 的情况下,此 link 可能对执行相同的操作有用...: 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');

它应该得到正确的和想要的信息。