【问题标题】:SQL Case Sensitive String CompareSQL 区分大小写的字符串比较
【发布时间】:2023-03-22 01:33:01
【问题描述】:

你如何比较字符串以便只有当每个字符串的大小写都相等时比较才成立。例如:

Select * from a_table where attribute = 'k'

...将返回具有“K”属性的行。我不想要这种行为。

【问题讨论】:

  • 它可能不是您需要的,但您可以更改排序规则或在查询中使用特定排序规则。
  • 哪个 SQL 产品?

标签: sql sql-server


【解决方案1】:
Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS 

成功了。

【讨论】:

  • 我通常会使用 Latin1_General_Bin
  • 是的,标准方法是使用不区分大小写的排序规则,尽管排序规则本身是特定于供应商的。是你的 SQL Server 语法吗?
  • 就我而言,我的数据库中有 1 列区分大小写。我需要将其与标准 (CI) 列进行比较。我使用了这个 WHERE Foo.Bar = (Baz.Bar COLLATE Latin1_General_CS_AS) 的变体
  • 谢谢,但 Latin1_General_CS_AS 是什么?是特殊关键字吗?
  • @VijaySinghRana Latin1_General_CS_AS 是排序规则的规范。整理是指一组确定数据如何排序和比较的规则。请参阅this page 了解更多信息。
【解决方案2】:

您还可以使用以下语法将该属性转换为 区分大小写

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CS_AS

现在您的搜索将区分大小写

如果您想再次使该列不区分大小写,请使用

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS

【讨论】:

  • 我有 nvarchar 类型的列。上面的查询对我不起作用。有什么原因吗?
【解决方案3】:

您可以轻松地将列转换为 VARBINARY(Max Length),长度必须是您期望的最大长度以避免有缺陷的比较,将长度设置为列长度就足够了。修剪列可帮助您比较实际值,除了空格在表列中具有意义和值,这是一个简单的示例,如您所见,我修剪列值,然后转换和比较。:

CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2)))

希望对您有所帮助。

【讨论】:

    【解决方案4】:

    作为另一种选择,您可以使用 HASHBYTES,如下所示:

    SELECT * 
    FROM a_table 
    WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')
    

    【讨论】:

    • 碰撞怎么办?这很少见,但我认为会有多个字符串散列到相同的值。
    • 是的,但在我认为的这样一个简单的字符串示例中极为罕见。
    • @DavidKlempfner 为什么不先进行比较,如果它们匹配,那么还要检查哈希字节?我们可以使它成为一个函数并像 StringsAreCaseSensitiveEqual(a, b) => a = b AND HASHBYTES('sha1', a) = HASHBYTES('sha1', b) 那样调用它
    【解决方案5】:

    简化一般答案

    SQL 区分大小写的字符串比较

    这些示例可能会有所帮助:

    Declare @S1 varchar(20) = 'SQL'
    Declare @S2 varchar(20) = 'sql'
    
      
    if @S1 = @S2 print 'equal!' else print 'NOT equal!' -- equal (default non-case sensitivity for SQL
    
    if cast(@S1 as binary) = cast(Upper(@S2) as binary) print 'equal!' else print 'NOT equal!' -- equal
    
    if cast(@S1 as binary) = cast(@S2 as binary) print 'equal!' else print 'NOT equal!' -- not equal
    
    if  @S1 COLLATE Latin1_General_CS_AS  = Upper(@S2) COLLATE Latin1_General_CS_AS  print 'equal!' else print 'NOT equal!' -- equal
    
    if  @S1 COLLATE Latin1_General_CS_AS  = @S2 COLLATE Latin1_General_CS_AS  print 'equal!' else print 'NOT equal!' -- not equal
    
     
    

    转换可能比哈希字节的运行时计算更有效,我希望整理可能会更快。

    【讨论】:

      【解决方案6】:

      您可以将attribute 定义为BINARY 或使用INSTRSTRCMP 来执行搜索。

      【讨论】:

      • 根据问题标签,此回复似乎与 SQL Server 无关。该 DBMS 缺少这些 INSTRSTRCMP 函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多