Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to collate SQL_Latin1_General_CP1_CI_AS using IN operator

I want to filter records on 'Email' my query is like this.

SELECT * FROM #temp WHERE email NOT IN (SELECT email FROM Customer)

It gives me following error

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.

I can use collate if there is equal operator (=) instead of IN. But using Collate here gives me syntax error.

SELECT * FROM #temp WHERE email NOT IN (SELECT email FROM Customer) collate SQL_Latin1_General_CP1_CI_AS

How can I resolve this. I can't drop and re create tables because it is live db.

Data in #temp table is from SQL Server 2000 and Customer table is in SQL Server 2005

Thanks.

like image 967
Kashif Avatar asked Jan 05 '10 05:01

Kashif


People also ask

What does COLLATE SQL_Latin1_General_CP1_CI_AS?

The collate clause is used for case sensitive and case insensitive searches in the columns of the SQL server. There are two types of collate clause present: SQL_Latin1_General_CP1_CS_AS for case sensitive. SQL_Latin1_General_CP1_CI_AS for case insensitive.

How do you COLLATE in Union?

COLLATE can be used at the database level or the column level. Since you are trying to UNION two tables, using the column collation on the needed columns will resolve your query. Of course, if you have several columns with conflicting collations you will need to define their collations as well.

How do you calculate collation?

To view the collation setting of a databaseIn Object Explorer, connect to an instance of the Database Engine and on the toolbar, click New Query. In the query window, enter the following statement that uses the sys. databases system catalog view. SELECT name, collation_name FROM sys.

What is the use of COLLATE Latin1_General_CS_AS?

Collation Latin1_General_CS_AS uses dictionary order so both upper and lower case characters of the specified range are included. Specify a binary collation to get the behavior you want (the 26 ASCII characters in the 97-122 code point range): SELECT empid, lastname FROM HR.


1 Answers

...
NOT IN (SELECT email COLLATE SQL_Latin1_General_CP1_CI_AS AS email FROM Customer)

The collate bit follows the column name, basically.

Or this (it depends on which one you want):

SELECT * FROM #temp WHERE email collate SQL_Latin1_General_CP1_CI_AS NOT IN (SELECT email FROM Customer) 

Finally, if your DB is SQL_Latin1_General_CP1_CI_AS, one option is to use ...COLLATE Database_Default... to coerce to a default setting.

like image 90
gbn Avatar answered Sep 28 '22 16:09

gbn