Αναζήτηση εγγραφής σε SQL με πληκτρολόγηση ελληνικών και λατινικών χαρακτήρων.

Πόσες φορές μας έχει τύχει να μήν προσέχουμε την γλώσσα του πληκτρολογίου μας και να γράφουμε σέ ένα πεδίο εύρεσης λατινικούς χαρακτήρες και κατόπιν να χρειάζεται να σβήσουμε αυτό που γράψαμε.

Πόσο ποιό καλό θα ήταν να αλλάξουμε την γλώσσα του πληκτρολογίου μας και να συνεχίσουμε από εκεί που σταματήσαμε πληκτρολογώντας μέ ελληνικούς χαρακτήρες.

Π.Χ. Θέλουμε να ψάξουμε στον πίνακα 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βροχο')+'%'
Ελπίζω η παραπάνω συνάρτηση να βοηθήσει .Επίσης οποιαδήποτε παρατήρηση ,διόρθωση και βελτίωση του παραπάνω κώδικα είναι καλοδεχούμενη.
 
Share


Έχουν δημοσιευτεί Τετάρτη, 29 Ιουλίου 2009 2:01 μμ από το μέλος imanos
Καταχώρηση στις κατηγορίες:

Σχόλια:

Χωρίς Σχόλια