SQL 区分大小写比较
SQL case sensitive compare
我想用 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 |
正确的解决方案是修复您的列,以便您的数据存储在区分大小写的排序规则中。那么你只需要做:
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
old | new | is_same
:--- | :--- | ------:
test | test | 1
test | TEST | 0
null | null | 1
试试这个:
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
我想用 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 |
正确的解决方案是修复您的列,以便您的数据存储在区分大小写的排序规则中。那么你只需要做:
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
old | new | is_same :--- | :--- | ------: test | test | 1 test | TEST | 0 null | null | 1
试试这个:
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