如何使用 SQL_Latin1_General_CP1_CI_AS 排序规则在 SQL 中检查 'AAA' 与 'AAa'
How to check 'AAA' vs 'AAa' in TSQL using SQL_Latin1_General_CP1_CI_AS collation
我有一个问题,我似乎无法解决它。
我的数据库具有上述排序规则设置,SQL_Latin1_General_CP1_CI_AS,我无法更改,并且我从另一个具有 SQL_Latin1_General_CP1_CS_AS 的数据库中导入了一个列,值 'AAA' 和 [=23] =].
此外,通过加入此字段,我必须从另一个 table(与我的数据库相同的排序规则,SQL_Latin1_General_CP1_CI_AS)中检索另一列的值。
我的问题是,由于这种整理,SQL_Latin1_General_CP1_CI_AS,两个值('AAA' 和 'AAa')都是 "seen" 和我加入的 return 值对于 'AAA' 和 'AAa',它应该 return 只为 'AAa' 匹配连接。
是否有 "trick" 可以帮助我仅过滤 'AAa's ?意味着以某种方式模仿 SQL_Latin1_General_CP1_CS_AS 排序规则?
此致,
乐:
我有两个 tables,Table1 和 Table2。 Table1 有 column1 - ID,column2- currency。 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
但是它不起作用,因为对于具有 EUR 的 ID,我得到了费率,尽管我应该只有那些只有 EUr 作为费率的 ID。
select *
from t
where col collate SQL_Latin1_General_CP1_CS_AS = 'AAa'
rextester 演示:http://rextester.com/CZAWR50665
returns 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;
returns
+-----+-----+
| col | col |
+-----+-----+
| AAA | AAA |
| AAa | AAa |
| aAa | aAa |
| AaA | AaA |
+-----+-----+
通常,SQL 服务器不区分大小写(就像大多数其他 SQL 语言一样 - MySQL 具有启用或禁用区分大小写功能的功能。请参阅-> Is SQL syntax case sensitive?).因此,如果您使用的是 SQL 服务器,那么数据中可能存在一些其他问题,例如某些无效字符。像 char(9) 或 char(10) 等。但是,如果您确定问题确实如此,那么请尝试通过将两个文件的大小写转换为大写或小写来连接这些值。像下面的东西
SELECT
*
FROM table1 t1
INNER JOIN table2 t2
ON UPPER(t1.Colname) = UPPER(t2.Colname)
我有一个问题,我似乎无法解决它。 我的数据库具有上述排序规则设置,SQL_Latin1_General_CP1_CI_AS,我无法更改,并且我从另一个具有 SQL_Latin1_General_CP1_CS_AS 的数据库中导入了一个列,值 'AAA' 和 [=23] =]. 此外,通过加入此字段,我必须从另一个 table(与我的数据库相同的排序规则,SQL_Latin1_General_CP1_CI_AS)中检索另一列的值。 我的问题是,由于这种整理,SQL_Latin1_General_CP1_CI_AS,两个值('AAA' 和 'AAa')都是 "seen" 和我加入的 return 值对于 'AAA' 和 'AAa',它应该 return 只为 'AAa' 匹配连接。 是否有 "trick" 可以帮助我仅过滤 'AAa's ?意味着以某种方式模仿 SQL_Latin1_General_CP1_CS_AS 排序规则? 此致,
乐: 我有两个 tables,Table1 和 Table2。 Table1 有 column1 - ID,column2- currency。 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
但是它不起作用,因为对于具有 EUR 的 ID,我得到了费率,尽管我应该只有那些只有 EUr 作为费率的 ID。
select *
from t
where col collate SQL_Latin1_General_CP1_CS_AS = 'AAa'
rextester 演示:http://rextester.com/CZAWR50665
returns 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;
returns
+-----+-----+
| col | col |
+-----+-----+
| AAA | AAA |
| AAa | AAa |
| aAa | aAa |
| AaA | AaA |
+-----+-----+
通常,SQL 服务器不区分大小写(就像大多数其他 SQL 语言一样 - MySQL 具有启用或禁用区分大小写功能的功能。请参阅-> Is SQL syntax case sensitive?).因此,如果您使用的是 SQL 服务器,那么数据中可能存在一些其他问题,例如某些无效字符。像 char(9) 或 char(10) 等。但是,如果您确定问题确实如此,那么请尝试通过将两个文件的大小写转换为大写或小写来连接这些值。像下面的东西
SELECT
*
FROM table1 t1
INNER JOIN table2 t2
ON UPPER(t1.Colname) = UPPER(t2.Colname)