SQL不区分大小写的IN搜索

3

我有一个名为 "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')

1
@SalmanA 这与 d100m 不匹配。 - Toshi
4
你使用哪种数据库管理系统? - user330315
1
您可以创建一个单独的Serial_search列,将每个值存储为大写和小写。 - Pekka
@Toshi,请问你的 WHERE Serial LIKE 'D100M' OR Serial LIKE 'D200M' 是否按预期工作,即不区分大小写? - Salman A
OP你必须指定你正在使用的RDBMS。因为在SQL Server中,你可以仅更改查询的排序规则,在PostgreSQL中,这个问题是没有意义的(LIKE是区分大小写的),在Oracle或DB2中,解决方案完全不同。 - Alex
显示剩余2条评论
6个回答

8
最简单的方法是:
SELECT Serial 
FROM Table 
WHERE upper(Serial) in ('D100M', 'D200M');

但这并不会使用 serial 列上的索引。

因此,如果性能是一个问题,您需要在 upper(serial) 上创建一个索引。


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

更新: 如果所有序列号都应该以大写字母检查,则可以使用:

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

这个怎么实现不区分大小写的呢? - Pekka
1
如果我理解正确,不区分大小写意味着不必检查大小写。因此,您可以将所有字符串转换为大写来进行检查,对吗? - dns_nx
强制特定情况,意味着您不需要考虑小写字母,这是一种非常好的穷人不区分大小写的检查方法。缺点是您的检查必须大写编写,但无论如何您都必须编写它们,因此这只是一个非常小的问题。 - kyle

1
只要您不使用通配符或其他like运算符字符,就可以使用此脚本:
SELECT Serial FROM Table WHERE upper(Serial) IN ('D100M', 'D200M')

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

1
我假设您想要忽略大小写获取记录。您可以使用upper或lower函数并执行以下操作:
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子句作为一个小表...

这是Oracle特定的。

如果使用MS SQL,可以使用此链接执行相同的操作...: http://sqljason.com/2010/05/converting-single-comma-separated-row.html


0

您可以检查以下内容:

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

它应该获取正确和期望的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接