go backarticles

Articles of SQLschool.gr Team

Collations and string comparison in SQL Server

Fivi Panopoulou - Sotiris Karras

Σε αυτό το post θα ασχοληθούμε με το πώς μπορούμε να συγκρίνουμε στην T-SQL strings με διαφορετικό collation. Επίσης, θα δούμε πως μπορούμε να χρησιμοποιήσουμε την αλλαγή του collation για να κάνουμε case sensitive searches, στην περίπτωση που έχουμε case insensitive collation (το οποίο είναι και το προεπιλεγμένο).

Ας υποθέσουμε ότι έχουμε μια βάση (έστω ότι λέγεται DemoDb1), η οποία έχει έναν πίνακα με κάποια προϊόντα. Ο πίνακας αυτός είναι ο παρακάτω:

"

Έστω ότι θέλουμε να δούμε τα κοινά με τον αντίστοιχο πίνακα της NORTHWND προϊόντα. Ο πίνακας αυτός περιλαμβάνει τα παρακάτω στοιχεία που μας αφορούν:

"

Παρατηρούμε ότι με βάση το όνομα του προϊόντος μπορούμε να κάνουμε αυτό που θέλουμε και έτσι γράφουμε το παρακάτω query:

SELECT p1.ProductName, p1.ProductId as Id1, p2.ProductID as Id2, 
       p2.QuantityPerUnit, p2.UnitPrice
FROM DemoDb1.dbo.Products as p1
INNER JOIN NORTHWND.dbo.Products as p2
    ON p1.ProductName = p2.ProductName;
GO

Τρέχοντας το παραπάνω query όμως, παίρνουμε το παρακάτω error:

"

Αυτό σημαίνει ότι οι δύο στήλες τις οποίες κάναμε join ήταν φτιαγμένες με διαφορετικό collation και για αυτό δεν μας επιτρέπεται η απευθείας σύγκριση μεταξύ των τιμών τους.
Με το παρακάτω query βλέπουμε το collation που έχουν οι δύο αυτές βάσεις:

SELECT name, collation_name
FROM sys.databases
WHERE name IN (N'NORTHWND',N'DemoDB1');
GO

Το αντίστοιχο αποτέλεσμα είναι:

"

Η λύση για να πετύχουμε αυτό που θέλαμε αρχικά είναι να μετατρέψουμε κατά την σύγκριση το collation των τιμών της μιας στήλης σε αυτό της άλλης. Το query και το αντίστοιχο αποτέλεσμα είναι τα εξής:

SELECT p1.ProductName, p1.ProductId as Id1, p2.ProductID as Id2, 
       p2.QuantityPerUnit, p2.UnitPrice
FROM DemoDb1.dbo.Products as p1
INNER JOIN NORTHWND.dbo.Products as p2
    ON p1.ProductName = p2.ProductName COLLATE Greek_CI_AS;
GO

"

Με την μετατροπή αυτή, όχι μόνο μπορούμε να κάνουμε σύγκριση strings που ανήκουν σε διαφορετικά γλωσσικά collations, αλλά και να κάνουμε case sensitive συγκρίσεις στην ίδια γλώσσα. Για παράδειγμα, τα δύο παρακάτω Queries στην NORTHWIND μας επιστρέφουν αμφότερα το ίδιο προϊόν, καθώς το collation που έχουμε είναι case insensitive.

SELECT ProductID, ProductName 
FROM Products
WHERE ProductName  = N'Queso Cabrales';
GO


SELECT ProductID, ProductName 
FROM Products
WHERE ProductName  = N'queso cabrales';
GO

Αν θέλαμε να είναι case sensitive το search με το όνομα του προϊόντος, θα έπρεπε να τρέξουμε το query που ακολουθεί, μετατρέποντας το collation στο αντίστοιχο case sensitive. Αυτό δεν θα μας γυρίσει κανένα αποτέλεσμα.

SELECT ProductID, ProductName 
FROM Products
WHERE ProductName COLLATE SQL_Latin1_General_CP1_CS_AS = N'queso cabrales';
GO


Fivi Panopoulou

Fivi Panopoulou

System Engineer • Speaker

Το 2007 ξεκίνησα τις σπουδές μου στη σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών στο Εθνικό Μετσόβιο Πολυτεχνείο.Κατά την διάρκεια των σπουδών μου εκεί αγάπησα τον προγραμματισμό και τα συστήματα πληροφορικής, καθώς επίσης απέκτησα το ιδιαίτερο ενδιαφέρον μου για τις βάσεις δεδομένων. Κατά την διάρκεια της διπλωματικής μου ασχολήθηκα με ζητήματα ανωνυμοποίησης δεδομένων και την ανάπτυξη σχετικού εργαλείου. Τα τελευταία χρόνια των σπουδών μου, μου δόθηκε η ευκαιρία να ασχοληθώ περισσότερο και να διευρύνω τους ορίζοντές μου ως Microsoft Student Partner και μέσω της κοινότητας Student Guru. Στα πλαίσια των κοινοτήτων αυτών, ξεκίνησα να ασχολούμαι με παρουσιάσεις αλλά και να γνωρίζω τον SQL Server. Από την πρώτη στιγμή που ασχολήθηκα μαζί του, συνειδητοποίησα πόσο ήθελα να εμβαθύνω τις γνώσεις μου σχετικά με αυτόν και τα συστήματα διαχείρισης βάσεων δεδομένων γενικότερα, πράγμα που προσπαθώ να κάνω έκτοτε. Πριν χρόνια είχα την τύχη να συμμετέχω στο πρόγραμμα mentoring, μέσω του οποίου γνώρισα τον κ. Χατζηπαυλή. Από τότε συμμετέχω στην ομάδα του SQLschool.gr.


Sotiris Karras

Sotiris Karras

System Engineer • Speaker

Είμαι απόφοιτος της σχολής Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών του Εθνικού Μετσόβιου Πολυτεχνείου και στα ενδιαφέροντά μου συμπεριλαμβάνεται o τομέας του Knowledge and Data Engineering. Πιο συγκεκριμένα, έχω ασχοληθεί ακαδημαϊκά και ερευνητικά με τον τομέα του data privacy και data anonymity, ενώ πάθος μου είναι ό,τι έχει να κάνει με relational databases και data management. Στο παρελθόν, έχω συνεργαστεί με την Microsoft Hellas ως Microsoft Student Partner για ακαδημαϊκές δραστηριότητες και ήμουν μέρος του MVP mentoring προγράμματός της, στο οποίο είχα την τύχη να γνωρίσω τον κ. Χατζηπαυλή.


Relative Articles

Leave your comment

COMMENT

FULL NAME

EMAIL ADDRESS

We use Gravatar

WEB SITE



captcha


 

Newsletter

If you want to receive updates from us subscribe below with your email.
Follow us in
PASS chapter logo

The Official PASS Local Group for Greece

About us Contact us Terms of Use Privacy Sing in Register
sql school greece logo
© 2010-2020 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.