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


130


我在表中有以下数据
PriceOrderShipped
PriceOrderShippedInbound
PriceOrderShippedOutbound

在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%'

Answers:


232

使用这样的东西-

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%')

14
我认为您应该始终将大写的字符串(大写)作为最佳实践进行比较。Google“土耳其语i”
Traubenfuchs

2
想知道您的答案是否存在性能问题,方法是将列值转换为UPPERLOWER大小写,然后使用LIKE进行搜索?
shaijut

实际上,您将不得不同时比较UPPER和LOWER变体,因为某些字符在大写形式中具有不同的表示形式,而在小写形式中具有相同的表示形式。对于其他字符,可能相反。Java在不区分大小写的比较中特别提到了格鲁吉亚字母,作为对toLowerCase()进行附加处理的原因。
Crusha K. Rool

1
不幸的是,这种方法导致了本表中描述的全表扫描:alvinalexander.com/sql/…。无法使用索引搜索,因为已过滤的列已通过UPPER / LOWER函数进行了修改。
Jeff S.

如果使用高/低的查询性能不足,则设置排序规则(在创建索引之前)似乎是更好的方法。
Jeff S.

10

看到类似的问题,以不区分大小写的方式进行搜索-SQL Server在where表达式中忽略大小写

尝试使用类似:

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

它无法正常工作,在整理之前我得到的SQL查询未正确结束
shockwave

@米格尔-F ..它工作正常,但它是如何从SELECT DISTINCT COL_NAME FROM mytable的不同处,COL_NAME LIKE“%priceorder%”,因为这对我来说也是工作正常..
Jishant

我建议改用“ SQL_Latin1_General_Cp1_CI_AS_KI_WI”。对于搜索来说,大小写并不敏感。
user8155123'9

8

像这样。

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

在PostgreSQL中。


4
这个问题被标记为sql-server,所以postgres的答案是不相关的。
利亚姆

4

您可能应该将其SQL_Latin1_General_Cp1_CI_AS_KI_WI用作排序规则。您在问题中指定的一个明确区分大小写。

您可以在此处查看归类列表。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.