Πόσες φορές μας έχει τύχει να μήν προσέχουμε την γλώσσα του πληκτρολογίου μας και να γράφουμε σέ ένα πεδίο εύρεσης λατινικούς χαρακτήρες και κατόπιν να χρειάζεται να σβήσουμε αυτό που γράψαμε.
Πόσο ποιό καλό θα ήταν να αλλάξουμε την γλώσσα του πληκτρολογίου μας και να συνεχίσουμε από εκεί που σταματήσαμε πληκτρολογώντας μέ ελληνικούς χαρακτήρες.
Π.Χ. Θέλουμε να ψάξουμε στον πίνακα Products για τα προϊόντα που περιέχουν στην περιγραφή τους την λέξη αδιαβροχο.
Θα γράφαμε select * from Products where ProductName like '%αδιαβροχο%' και φυσικά θα μας επέστρεφε τα προϊόντα για τα οποία έτρεξε το select.
Τι θα γινόταν όμως αν γράφαμε το εξής select * from Products where ProductName like '%Adiaβροχο%' . Φυσικά και δεν θα μας επέστρεφε τίποτα.
Παρακάτω θα σας δώσω μία sql function η οποία κάνει εφικτό το παραπάνω search
GO
/****** Object: UserDefinedFunction [dbo].[SearchAny] Script Date: 07/29/2009 14:21:12 ******/
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[SearchAny]') AND xtype in (N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[SearchAny]
GO
/****** Object: UserDefinedFunction [dbo].[SearchAny] Script Date: 07/29/2009 14:21:38 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE FUNCTION [dbo].[SearchAny](@value varchar(8000)) RETURNS varchar(8000)
AS
BEGIN
DECLARE @i int,
@length int,
@character char(1),
@newValue varchar(8000)
IF ISNULL(@value, '') = '' RETURN ''
-- Αντικατάσταση των διφθόγγων ελληνικά,αγγλικά
SET @value = REPLACE(@value, 'οι', 'I')
SET @value = REPLACE(@value, 'ει', 'I')
SET @value = REPLACE(@value, 'αι', 'E')
SET @value = REPLACE(@value, 'oi', 'I')
SET @value = REPLACE(@value, 'ei', 'I')
SET @value = REPLACE(@value, 'ai', 'E')
SET @value = REPLACE(@value, 'ου', 'U')
SET @value = REPLACE(@value, 'ou', 'U')
SET @value = REPLACE(@value, 'th', 'U') -- Ελληνικό θήτα
SELECT @length = LEN(@value), @newValue = ''
SET @i = 1
WHILE @i <= @length
BEGIN
SET @character = SUBSTRING(@value, @i, 1)
----Ανάθεση χαρακτήρα
IF @character IN ('Α', 'Ά', 'α', 'ά') SET @character= 'A'
ELSE IF @character IN ('Β', 'β') SET @character= 'B'
ELSE IF @character IN ('Γ', 'γ') SET @character= 'G'
ELSE IF @character IN ('Δ', 'δ') SET @character= 'D'
ELSE IF @character IN ('Ε', 'ε', 'Έ', 'έ') SET @character= 'E'
ELSE IF @character IN ('Ζ', 'ζ') SET @character= 'Z'
ELSE IF @character IN ('Η', 'η', 'Ή', 'ή', 'Υ', 'υ', 'Ύ', 'ύ', 'Ϋ', 'ϋ', 'Ι', 'ι', 'Ί', 'ί', 'Ϊ', 'ϊ', 'Y', 'y', 'H', 'h') SET @character= 'I'
ELSE IF @character IN ('Θ', 'θ') SET @character= 'U'
ELSE IF @character IN ('Κ', 'κ') SET @character= 'K'
ELSE IF @character IN ('Λ', 'λ') SET @character= 'L'
ELSE IF @character IN ('Μ', 'μ') SET @character= 'M'
ELSE IF @character IN ('Ν', 'ν') SET @character= 'N'
ELSE IF @character IN ('Ξ', 'ξ') SET @character= 'J'
ELSE IF @character IN ('Ο', 'ο', 'Ό', 'ό', 'Ω', 'ω', 'Ώ', 'ώ') SET @character= 'O'
ELSE IF @character IN ('Π', 'π') SET @character= 'P'
ELSE IF @character IN ('Ρ', 'ρ') SET @character= 'R'
ELSE IF @character IN ('Σ', 'σ', 'ς') SET @character= 'S'
ELSE IF @character IN ('Τ', 'τ') SET @character= 'T'
ELSE IF @character IN ('Φ', 'φ') SET @character= 'F'
ELSE IF @character IN ('Χ', 'χ') SET @character= 'X'
ELSE IF @character IN ('Ψ', 'ψ') SET @character= 'C'
ELSE IF @character IN ('.') SET @character= '%'
--Δημιουργία λέξης
SET @newValue = @newValue + @character
SET @i = @i + 1
END
RETURN UPPER(@newValue)
END
Τώρα χρησιμοποιώνας στο select statement την παραπάνω function το select θα μου επιστρέψει δεδομένα
select * from Products where UPPER(dbo.SearchAny(ProductName)) like '%'+dbo.SearchAny('Adiaβροχο')+'%'
Ελπίζω η παραπάνω συνάρτηση να βοηθήσει .Επίσης οποιαδήποτε παρατήρηση ,διόρθωση και βελτίωση του παραπάνω κώδικα είναι καλοδεχούμενη.