SQL-在搜索字符串时忽略大小写

194


我在一个表格中有以下数据:
价格订单已发货
价格订单已发入库
价格订单已发出库

在SQL中,我需要编写一个查询来搜索表格中的字符串。在搜索字符串时,应忽略大小写。对于下面提到的SQL查询:

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%PriceOrder%' 

提供了以上所有数据,然而

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%Priceorder%' 

不起作用。

例如,当我搜索 'PriceOrder' 或 'priceOrder' 时,它可以工作,但是 'priceorder' 或 'Priceorder' 不起作用。我尝试使用 COLLATE 进行以下查询,但它没有起作用。请告诉我我错在哪里。

SELECT DISTINCT COL_NAME FROM myTable WHERE 
COL_NAME COLLATE latin1_general_cs LIKE '%Priceorder%'

9个回答

377

使用类似这样的内容 -

SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')
或者
SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')

28
我认为最佳实践应该总是将字符串大写(UPPER)进行比较。请搜索“土耳其i”。 - ASA
5
请问您想了解的是,将列的值转换为大写或小写后再使用LIKE进行搜索是否会有性能问题? - Shaiju T
1
实际上,您需要比较大写和小写变体,因为某些字符在大写时具有不同的表示,但在小写时具有相同的表示。对于其他字符,情况可能相反。Java特别提到格鲁吉亚字母表作为进行额外toLowerCase()的原因,以进行不区分大小写的比较。 - Crusha K. Rool
5
遗憾的是,这种方法会导致完整表扫描,就像这篇文章中描述的那样:https://alvinalexander.com/sql/sql-select-case-insensitive-query-queries-upper-lower。索引搜索无法应用,因为过滤列被UPPER/LOWER函数修改了。 - Jeff S.
如果使用upper/lower查询性能不足,那么在创建索引之前设置排序规则似乎是更好的方法。 - Jeff S.
MySQL中的LIKE运算符是否区分大小写?在我看来,它是不区分大小写的。 - Indika K

48

就像这样。

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%Priceorder%'

在PostgreSQL中。


10
这个问题被标记为[tag:sql-server],所以postgres的答案不相关。 - Liam
谢谢。我在Apache Spark上应用了相同的逻辑,它可以正常工作。 - elgsylvain85

13

看看这个类似的问题和答案,关于如何进行大小写不敏感搜索 - SQL server ignore case in a where expression

尝试使用类似以下的语句:

SELECT DISTINCT COL_NAME 
FROM myTable 
WHERE COL_NAME COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%priceorder%'

查询没有正常结束,出现了Collate错误。 - shockwave
@Miguel-F..它运行得很好,但它与以下查询有何不同: SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%priceorder%' 因为这个对我也很好用。 - Jishant
我建议使用“SQL_Latin1_General_Cp1_CI_AS_KI_WI”代替。它对搜索不区分大小写。 - YongaJ

4

您应该使用SQL_Latin1_General_Cp1_CI_AS_KI_WI作为排序规则。您在问题中指定的那个是明确区分大小写的。

您可以在这里查看排序规则列表。


3

在几乎所有的SQL编译器中,like运算符都不区分大小写。如果您仍然没有得到区分大小写的结果,那么可以使用iLike运算符。此外,您还可以使用Upper()方法更改大小写进行比较。

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%PriceOrder%' 

或者

SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')
SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')

1

以下是我使用的解决方案。

SELECT * FROM TABLE WHERE COLUMN ~* '.*search_keyword_any_case.*'

这也将检查子字符串。

总体而言,我从互联网上找到的最佳解决方案。我使用相同的方法来实现表格列的不区分大小写的子字符串搜索。


1

如果有人在使用ORACLE,可以在数据库级别进行更改。

ALTER SESSION SET NLS_COMP=LINGUISTIC;  
ALTER SESSION SET NLS_SORT=BINARY_CI;  

注意: - Oracle

0

备选方案和最佳解决方案:
您还可以使用特定的“排序规则”,例如utf8> utf8_unicode_ci。然后,所有查询都将不区分大小写。但是,数据可能在某些地方以大写形式存在。因此,请确保不存在可能具有不同大小写的双胞胎(例如使用唯一列来确保)。

查询示例:
https://prnt.sc/1vjwxd1
表设计和排序规则使用:https://prnt.sc/1vjx3h5

“良好的数据库设计可以为您节省大量查询工作”-我 :)


我的联盟是utf8_general_ci,但查询仍然区分大小写。 - Twiggit

0

LIKE和ILIKE允许在基于字符的列数据中进行模式匹配。它们的语法相同,但LIKE区分大小写,而ILIKE不区分大小写。 我正在使用PostgreSQL,对我来说它很好用。即:

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%Priceorder%'


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