【问题标题】:SQL case sensitive compareSQL 区分大小写比较
【发布时间】:2020-12-22 16:07:12
【问题描述】:

我想通过 CASE 语句了解两个字段是否相同。

我设法通过以下查询做到了,但我想知道是否有更好的方法? 我只希望 '=' 进行区分大小写的比较。我尝试使用 COLLATE,但后来我需要使用 WHERE 子句来过滤我的结果,我想要所有行。使用 HASHBYTES 似乎有点过头了,尤其是当我需要将它与 ISNULL 结合使用时

DECLARE @myTable AS TABLE (old varchar(255), new varchar(255));
INSERT INTO @myTable VALUES
    ('test', 'test'),
    ('test', 'TEST'),
    (null, null)


SELECT old, new, 
    CASE WHEN HASHBYTES('SHA2_512', old) = HASHBYTES('SHA2_512', new) THEN 'same' ELSE 'changed' END AS updated,
    CASE WHEN HASHBYTES('SHA2_512', ISNULL(old, '')) = HASHBYTES('SHA2_512', ISNULL(new, '')) THEN 'same' ELSE 'changed' END AS updated_isnull
FROM @myTable
--where old = new COLLATE Latin1_General_CS_AS

我需要列“updated_isnull”

| old  | new  | updated | updated_isnull |
| ---- | ---- | ------- | -------------- |
| test | test | same    | same           |
| test | TEST | changed | changed        |
| NULL | NULL | changed | same           |

【问题讨论】:

  • 您确定您正在运行 MySQL 吗?我认为它不支持这样声明表变量。
  • 我希望它是 ms-sql,而不是 mysql
  • 仅供参考,它是一个案例表达式而不是一个语句。

标签: sql sql-server string case sql-null


【解决方案1】:

正确的解决方案是修复列,以便将数据存储在区分大小写的排序规则中。然后你会这样做:

select old, new,
    case when old = new
             or (old is null and new is null)
         then 1
        else 0 
    end as is_same
from @mytable

使用不区分大小写的排序规则,我们可以这样解决

select old, new,
    case when old collate Latin1_General_Bin = new collate Latin1_General_Bin 
             or (old is null and new is null)
         then 1
        else 0 
    end as is_same
from @mytable

Demo on DB Fiddle

旧 |新 |是一样的 :--- | :--- | ------: 测试 |测试 | 1 测试 |测试 | 0 | | 1

【讨论】:

  • 我尝试了类似的方法,但它给了我一个错误,让我认为我不能在 CASE 语句中使用 COLLATE。不记得到底是什么错误,但肯定是我的错误,因为我再次尝试,现在它可以工作了,谢谢。
【解决方案2】:

试试这个:

DECLARE @myTable AS TABLE (old varchar(255), new varchar(255));
INSERT INTO @myTable VALUES
    ('test', 'test'),
    ('test', 'TEST'),
    (null, null)


SELECT old, new,
    CASE WHEN old COLLATE Latin1_General_CS_AS = new COLLATE Latin1_General_CS_AS THEN 'same' ELSE 'changed' END AS updated,
    CASE WHEN isnull(old,0) COLLATE Latin1_General_CS_AS = isnull(new,0) COLLATE Latin1_General_CS_AS THEN 'same' ELSE 'changed' END AS updated_isnull
FROM @myTable

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2011-05-28
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多