Jump to content
  • entries
    292
  • comments
    368
  • views
    59729

fnGreekEnglishLikeString Function


antonch

1346 views

 Share

Σήμερα είχα μια ωραία ερώτηση από μια αγαπητή συνάδελφο σχετικά με τον τελεστή LIKE. Η ερώτηση της ήταν:

«Πως μπορώ να έχω την δυνατότητα με τον τελεστή LIKE να έχω όλα τα records που είναι περασμένα μέσα στην βάση μου σε ένα πίνακα ακόμα και στην περίπτωση που έχουν περαστεί κάποιοι χαρακτήρες με ελληνικά και κάποιοι με αγγλικά;»

Στην ουσία αυτό που ήθελε ήταν αν έχω ένα πεδίο σε ένα πίνακα μου και έχω περάσει κάποια records που σε αυτό να έχω τις τιμές Antonis, Αντonis, Αntώνης εάν δώσω Antonis ή Αντώνης να μου τα φέρνει όλα.

Αυτό γίνεται εύκολα αρκεί να χρησιμοποιήσεις για κάθε χαρακτήρα της λέξης που βάζει στο Like το pattern με τις αγκύλες στο οποίο ορίζεις τους χαρακτήρες που θα ψάξεις

Πχ

Έστω ότι έχω τον παρακάτω πίνακα

create table tbLike 

( id int identity(1,1) primary key, 

memo nvarchar(100))

Στον οποίο περνάω 2 records

insert into tbLike values ('λαλα'),('λaλa')

και θέλω να μου φέρει και τα δύο records to query μου θα πρέπει να είναι το παρακάτω

select * from tbLike where memo like 'λ[aα]λ[aα]'

Επειδή αυτό θέλω να κατασκευάζεται αυτόματα τις έφτιαξα μια user define function η οποία παίρνει σαν παράμετρο το input του χρήστη και φτιάχνει το pattern me κάποιες παραδοχές όσον αφορά την αντιστοιχία των ελληνικών και αγγλικών γραμμάτων.

Αυτή είναι η παρακάτω

(σημείωση: Έχω προτιμήσει να την γράψω με τον απλούστερο τρόπο ώστε να είναι εύκολα μετατρέψιμη ακόμα και από κάποιον που ξέρει τα βασικά σε Τ-SQL)

  1: create function fnGreekEnglishLikeString(@instring nvarchar(100)) returns nvarchar(100)

  2: as

  3: begin

  4:   --abcdefghijklmnopqrstuvwxyz

  5:   --αβγδεζηθικλμνξοπρστυφχψω

  6:   

  7:   declare @rv nvarchar(100)

  8:   declare @i int = 1

  9:   declare @length int 

 10:   select @length = len(@instring)

 11:   declare @s nvarchar(10)

 12:   set @rv=''

 13:   while @i 

 14:   begin

 15:     set @s=''  

 16:     select @s=case 

 17:       when substring(@instring,@i,1) = 'a' or substring(@instring,@i,1) = 'α'  then '[aα]'

 18:       when substring(@instring,@i,1) = 'b' or substring(@instring,@i,1) = 'β'  then '[bβv]'

 19:       --when substring(@instring,@i,1) = 'c' or substring(@instring,@i,1) = '.'  then '[bβ]'

 20:       when substring(@instring,@i,1) = 'd' or substring(@instring,@i,1) = 'δ'  then '[dδ]'

 21:       when substring(@instring,@i,1) = 'e' or substring(@instring,@i,1) = 'ε'  then '[eε]'

 22:       when substring(@instring,@i,1) = 'f' or substring(@instring,@i,1) = 'φ'  then '[fφ]'

 23:       when substring(@instring,@i,1) = 'g' or substring(@instring,@i,1) = 'γ'  then '[gγ]'

 24:       when substring(@instring,@i,1) = 'h' or substring(@instring,@i,1) = 'β'  then '[hηiι]'

 25:       when substring(@instring,@i,1) = 'i' or substring(@instring,@i,1) = 'ι'  then '[iιhη]'

 26:       --when substring(@instring,@i,1) = 'j' or substring(@instring,@i,1) = 'β'  then '[bβ]'

 27:       when substring(@instring,@i,1) = 'k' or substring(@instring,@i,1) = 'κ'  then '[kκ]'

 28:       when substring(@instring,@i,1) = 'l' or substring(@instring,@i,1) = 'λ'  then '[lλ]'

 29:       when substring(@instring,@i,1) = 'm' or substring(@instring,@i,1) = 'μ'  then '[mμ]'

 30:       when substring(@instring,@i,1) = 'n' or substring(@instring,@i,1) = 'ν'  then '[nν]'

 31:       when substring(@instring,@i,1) = 'o' or substring(@instring,@i,1) = 'ο'  then '[oοω]'

 32:       when substring(@instring,@i,1) = 'p' or substring(@instring,@i,1) = 'π'  then '[pπ]'

 33:       --when substring(@instring,@i,1) = 'q' or substring(@instring,@i,1) = 'β'  then '[bβ]'

 34:       when substring(@instring,@i,1) = 'r' or substring(@instring,@i,1) = 'ρ'  then '[rρ]'

 35:       when substring(@instring,@i,1) = 's' or substring(@instring,@i,1) = 'σ' or substring(@instring,@i,1) = 'ς'  then '[sσς]'

 36:       when substring(@instring,@i,1) = 't' or substring(@instring,@i,1) = 'τ'  then '[tτ]'

 37:       when substring(@instring,@i,1) = 'u' or substring(@instring,@i,1) = 'υ'  then '[uυy]'

 38:       when substring(@instring,@i,1) = 'v' or substring(@instring,@i,1) = 'β'  then '[vβb]'

 39:       --when substring(@instring,@i,1) = 'w' or substring(@instring,@i,1) = 'β'  then '[bβ]'

 40:       when substring(@instring,@i,1) = 'x' or substring(@instring,@i,1) = 'χ'  then '[xχ]'

 41:       when substring(@instring,@i,1) = 'y' or substring(@instring,@i,1) = 'υ'  then '[uυy]'

 42:       when substring(@instring,@i,1) = 'z' or substring(@instring,@i,1) = 'ζ'  then '[zζ]'

 43:       else '['+substring(@instring,@i,1)+']'

 44:     end

 45:     set @rv=@rv+@s

 46:     set @i+=1

 47:   end

 48:   return @rv

 49: end

 50: go

Εάν κάποιος θέλει να δει το αποτέλεσμα που επιστρέφει η συγκεκριμένη function αρκεί να εκτελέσει το παρακάτω query

select dbo.fnGreekEnglishLikeString('antonis')

go

Εάν τώρα θέλει να το ενσωματώσει στο query του

select * from tbLike

where memo like dbo.fnGreekEnglishLikeString('antonis')

go

Happy T-SQL Programming

 Share

8 Comments


Recommended Comments

Το ευχαριστώ είναι λίγο και το ξέρεις. Η μόνη αλλαγή που έκανα ήταν να βάλω N παντού γιατί έχουμε και το θεματάκι με το database/server collation στο Azure.

 

Δυστυχώς πήραν θάρρος με την function και άρχισαν συζητήσεις για γραμματικό LIKE π.χ. να γράφω 'σύνταξη' και να βρίσκει και τα 'συντάξεις', 'συντάξεως' και δεν συμμαζεύεται. Ουφ.

 

Αντωνάκη θα τα πούμε στο event και με λίγη τύχη στο περίπτερο μας;

Link to comment

Οχι ρε φιλε δεν κάνανε αυτό οι άνθρωποι απλά ξεκίνησαν από αυτό γιατί οι χρήστες περνούσαν δεδομένα όπως λάχει και μετά έλεγαν ότι δεν τα βρήσκουν. Ξέρουν πολύ καλά τι θέλουν να κάνουν όπως ξέρουν πολύ καλά ότι αυτό που θέλουν ναι μεν υπάρχει στον SQL Server αλλά δεν υποστήριζει stemmer ελληνικό. Δυστυχώς όπως ξέρεις κάνουμε μεγάλο αγώνα για ν υπάρχει αυτή η δυνατότητα στον επόμενο Full Text Search του SQL Server

Link to comment
Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...