sql合并语句不区分大小写

8yoxcaq7  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(397)

我有以下几点 MERGE 声明:

MERGE TargetTable t
USING SourceTable s ON (t.ID = s.ID)

WHEN MATCHED 
     AND EXISTS (SELECT s.Day, s.Date, s.Name
                 EXCEPT
                 SELECT t.Day, t.Date, t.Name)
    THEN UPDATE 
         SET t.Day = s.Day,
             t.Date = s.Date,
             t.Name = s.Name

WHEN NOT MATCHED BY TARGET
    THEN INSERT (ID, Day, Date, Name)
         VALUES (s.ID, s.Day, s.Date, s.Name);

有更多的专栏,但我只是缩短它,以便于阅读。
所以当我运行这个时,它工作得很好,除了:如果我在源表中更改某个东西的大小写,它在目标表中不会得到更新。我相信这个问题可以通过对utf8使用collate来解决,但是我无法理解。
edit:如果我在源表中更改了某些内容,我的意思是:出于测试目的,我将执行合并,然后更改varchar字段,但只更改字母的大小写。然后,当我再次运行merge时,更改不会传播到目标表,因为它不会将更改视为不区分大小写的更改
谢谢

qco9c6ql

qco9c6ql1#

使用区分大小写的排序规则来限定列。
假设varchar列是用不区分大小写的排序规则定义的 SQL_Latin1_General_CP1_CI_AS (显式地,或者作为数据库的默认方式)。使用except的子查询将变成:

SELECT s.Day, s.Date, s.Name COLLATE SQL_Latin1_General_CP1_CS_AS
EXCEPT
SELECT t.Day, t.Date, t.Name COLLATE SQL_Latin1_General_CP1_CS_AS

这个 CS 在排序规则中,name表示区分大小写。这个 CI 不区分大小写。

相关问题