如何使用SQL_Latin1_General_CP1_CI_AS排序规则检查TSQL中的“AAA”与“AAa”

时间:2017-03-13 18:53:29

标签: sql-server tsql collation

我有一个问题,我似乎无法绕过它。 我的数据库有上面的排序规则设置,SQL_Latin1_General_CP1_CI_AS,我无法更改,我有一个列,我从另一个具有SQL_Latin1_General_CP1_CS_AS的数据库导入,两个值都是'AAA'和'AAa'。 通过加入这个字段,我必须从另一个表(与我的数据库相同的排序规则,SQL_Latin1_General_CP1_CI_AS)检索另一个列的值。  我的问题是,由于这种排序规则,SQL_Latin1_General_CP1_CI_AS,两个值('AAA'和'AAa')都被“看作”相同,我的连接返回'AAA'和'AAa'的值,它应返回匹配只加入'AAa'。   是否有一个“技巧”可以帮助我只过滤'AAa'?意思是以某种方式模拟SQL_Latin1_General_CP1_CS_AS整理? 的问候,

LE: 我有两个表,Table1和Table2。 Table1具有column1-ID,column2-货币。 Table2有列column1-currency和column2-rate。 table1和table2中的两列都具有不敏感的值(例如EUR和EUr)。我想从table2(速率值)中检索值,仅用于与确切货币匹配的行。我试过了

Select t1.id
, t1.currency
, t2.rate 
from table1 t1 
inner join table2 t2 on t1.currency=t2.currency COLLATE  SQL_Latin1_General_CP1_CS_AS

但它没有工作,因为有欧元的ID我得到了利率,虽然我应该只有只有欧盟作为利率的ID。

2 个答案:

答案 0 :(得分:4)

select * 
from t
where col collate SQL_Latin1_General_CP1_CS_AS = 'AAa'

rextester演示:http://rextester.com/CZAWR50665

从此测试设置中返回AAa

create table t (col varchar(32))
insert into t values
('AAA'),('AAa'),('aAa'),('AaA')

对于加入,您可以使用collate,如下所示:

select * 
from t
  inner join t as t2
    on t.col collate SQL_Latin1_General_CP1_CS_AS  = t2.col;

返回

+-----+-----+
| col | col |
+-----+-----+
| AAA | AAA |
| AAa | AAa |
| aAa | aAa |
| AaA | AaA |
+-----+-----+

答案 1 :(得分:-1)

通常,SQL Server不区分大小写(就像大多数其他SQL语言一样 - MySQL具有启用或禁用区分大小写功能的功能。参考 - > Is SQL syntax case sensitive?)。因此,如果您使用的是SQL Server,那么数据中可能会出现一些其他问题,例如一些无效字符。像char(9)或char(10)等。但是如果你确定问题是这样的,那么不要做任何事情然后尝试通过将两个文件的大小写转换为大写或小写来加入值。像下面的东西

SELECT
   *
FROM table1 t1
     INNER JOIN table2 t2
ON UPPER(t1.Colname) = UPPER(t2.Colname)