Evitar distincion con vocales acentuadas

20/06/2006 - 13:14 por Carlos Gómez | Informe spam
He creado una función que usa la función PatIndex, el problema es que
me distingue las vocales acentuadas y desearía que NO lo hiciera.

¿Alguien sabe como conseguirlo?

PD: Uso SQLServer 2005 Express


Desde Aguadulce (Almería)

Carlos Gómez

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
20/06/2006 - 14:08 | Informe spam
Carlos,

Nos puedes dar mas informacion sobre lo que hace la funcion?. Si es posible
postea el codigo de la funcion y dinos con que "collation" estas trabajando.


AMB


"Carlos Gómez" wrote:

He creado una función que usa la función PatIndex, el problema es que
me distingue las vocales acentuadas y desearía que NO lo hiciera.

¿Alguien sabe como conseguirlo?

PD: Uso SQLServer 2005 Express


Desde Aguadulce (Almería)

Carlos Gómez


Respuesta Responder a este mensaje
#2 Alejandro Mesa
20/06/2006 - 14:28 | Informe spam
Carlos,

Aca tienes un ejemplo de como lograr que SQL Server no distinga las vocales
acentuadas.

select
*
from
(
select 'o' as c1
union all
select 'ó'
union all
select 'ö'
) as t1
where
c1 like '%o%' collate SQL_Latin1_General_CP1_CI_AI
go


Chequea los libros en linea para mas info sobre la clausula "collate" y el
uso de collations en SQL Server.


AMB


"Alejandro Mesa" wrote:

Carlos,

Nos puedes dar mas informacion sobre lo que hace la funcion?. Si es posible
postea el codigo de la funcion y dinos con que "collation" estas trabajando.


AMB


"Carlos Gómez" wrote:

> He creado una función que usa la función PatIndex, el problema es que
> me distingue las vocales acentuadas y desearía que NO lo hiciera.
>
> ¿Alguien sabe como conseguirlo?
>
> PD: Uso SQLServer 2005 Express
>
>
> Desde Aguadulce (Almería)
>
> Carlos Gómez
>
>
Respuesta Responder a este mensaje
#3 Carlos Gómez
20/06/2006 - 18:25 | Informe spam
Alejandro Mesa wrote:

Carlos,

Nos puedes dar mas informacion sobre lo que hace la funcion?. Si es
posible postea el codigo de la funcion y dinos con que "collation" estas
trabajando.





La función realiza una busqueda de nombres que puedan estar en la base de
datos pero no esten escritos correctamente.

Con un ejemplo es sencillo de comprender lo que hace:

La base de datos es para uso de un grupo de emisoras de radio, y en la cual
se almacenan datos sobre musicos, grupos musicales, canciones publicadas,
noticias generales, etc, y luego una serie de datos sobre las
programaciones musicales de la emisora de radio y otra serie de datos
internos.

El problema habitual es el siguiente:
Dado un grupo musical (o musico, o canción, tanto da...) como por ejemplo
John Lee Hooker, puede ocurrir que se haya dado de alta con algún(s)
caracter mal tecleado o de muchas maneras, por ejemplo:
CORRECTO: John Lee Hooker
Otras formas:
Hooker, John Lee
Jhon Lee Hooker
etc...

La idea es que antes de dar de alta nuevamente a un elemento, devuelva
elementos ya dado de alta cuyo nombre se aproxime al que deseamos crear,
para así evitar tener duplicados por error
Otra utilidad es encontrar registros que no aparecen y tenemos la seguridad
de haberlos dado ya de alta

Para ello, la funcion compara el texto nuevo, con cada una de las filas y de
la tabla y devuelve un valor numerico > 0 que indica 'la similitud':
Entrada: el texto nuevo, y un campo de la base de datos
Salida: numero decimal que indica la similitud (mayor numero=mayor
similitud)

La función aun no está del todo terminada, pero ya realiza
satisfactoriamente su cometido, solo queda depurar algunos detalles, y
sobre encontrar la forma de disminuir el número de iteraciones que realiza


Bueno, la funcion en cuestion aqui la expongo:

FUNCTION [dbo].[SimilarSearch]
(@Patron varchar(50),
@Cadena varchar(50))
RETURNS money
BEGIN
declare @parcial money
declare @bloques money
declare @i int
declare @j int
declare @limite int
declare @p int
declare @aux varchar(50)
set @parcial = 0
set @bloques =0
set @i=0
set @limite=0
if len(@patron)>len(@cadena)
begin
set @aux=@patron
set @patron=@cadena
set @cadena=@aux
end
while (@i+@limite)<(len(@cadena)-1)
begin
set @j = len(@cadena) - @i
set @aux='%' + substring(@cadena,@i+1,@j) + '%'
set @p = patindex(@aux,@patron)-1
while (@p=-1) AND @j>(@limite +1)
begin
set @j = @j - 1
set @aux = '%' + substring(@cadena,@i+1,@j) + '%'
set @p = patindex(@aux,@patron) -1
end
if @j > @limite + 1
begin
SET @bloques = @bloques + @j
set @limite = @j
set @aux = '%' + substring(@cadena,@i+1,@j) + '%'
declare @divisor int
set @divisor = abs(@p - patindex(@aux,@cadena)+1)
set @parcial = @parcial + @j / (1.0 + cast(@divisor as money)/10)
end
if @limite > 1
set @limite = @limite - 1
set @i=@i+1
end
return @parcial * @bloques * @bloques /len(@cadena)/len(@patron)
END

Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
#4 Alejandro Mesa
20/06/2006 - 19:10 | Informe spam
Carlos,

Como comente en el mensaje anterior, ve si la clausula "collate" te es de
eyuda.

select
*
from
(
select 'o' as c1
union all
select 'ó'
union all
select 'ö'
) as t1
where
patindex('%o%', c1) > 0

select
*
from
(
select 'o' as c1
union all
select 'ó'
union all
select 'ö'
) as t1
where
patindex('%o%', c1 collate SQL_Latin1_General_CP1_CI_AI) > 0
go


AMB


"Carlos Gómez" wrote:

Alejandro Mesa wrote:

> Carlos,
>
> Nos puedes dar mas informacion sobre lo que hace la funcion?. Si es
> posible postea el codigo de la funcion y dinos con que "collation" estas
> trabajando.
>
>

La función realiza una busqueda de nombres que puedan estar en la base de
datos pero no esten escritos correctamente.

Con un ejemplo es sencillo de comprender lo que hace:

La base de datos es para uso de un grupo de emisoras de radio, y en la cual
se almacenan datos sobre musicos, grupos musicales, canciones publicadas,
noticias generales, etc, y luego una serie de datos sobre las
programaciones musicales de la emisora de radio y otra serie de datos
internos.

El problema habitual es el siguiente:
Dado un grupo musical (o musico, o canción, tanto da...) como por ejemplo
John Lee Hooker, puede ocurrir que se haya dado de alta con algún(s)
caracter mal tecleado o de muchas maneras, por ejemplo:
CORRECTO: John Lee Hooker
Otras formas:
Hooker, John Lee
Jhon Lee Hooker
etc...

La idea es que antes de dar de alta nuevamente a un elemento, devuelva
elementos ya dado de alta cuyo nombre se aproxime al que deseamos crear,
para así evitar tener duplicados por error
Otra utilidad es encontrar registros que no aparecen y tenemos la seguridad
de haberlos dado ya de alta

Para ello, la funcion compara el texto nuevo, con cada una de las filas y de
la tabla y devuelve un valor numerico > 0 que indica 'la similitud':
Entrada: el texto nuevo, y un campo de la base de datos
Salida: numero decimal que indica la similitud (mayor numero=mayor
similitud)

La función aun no está del todo terminada, pero ya realiza
satisfactoriamente su cometido, solo queda depurar algunos detalles, y
sobre encontrar la forma de disminuir el número de iteraciones que realiza


Bueno, la funcion en cuestion aqui la expongo:

FUNCTION [dbo].[SimilarSearch]
(@Patron varchar(50),
@Cadena varchar(50))
RETURNS money
BEGIN
declare @parcial money
declare @bloques money
declare @i int
declare @j int
declare @limite int
declare @p int
declare @aux varchar(50)
set @parcial = 0
set @bloques =0
set @i=0
set @limite=0
if len(@patron)>len(@cadena)
begin
set @aux=@patron
set @patron=@cadena
set @cadena=@aux
end
while (@i+@limite)<(len(@cadena)-1)
begin
set @j = len(@cadena) - @i
set @aux='%' + substring(@cadena,@i+1,@j) + '%'
set @p = patindex(@aux,@patron)-1
while (@p=-1) AND @j>(@limite +1)
begin
set @j = @j - 1
set @aux = '%' + substring(@cadena,@i+1,@j) + '%'
set @p = patindex(@aux,@patron) -1
end
if @j > @limite + 1
begin
SET @bloques = @bloques + @j
set @limite = @j
set @aux = '%' + substring(@cadena,@i+1,@j) + '%'
declare @divisor int
set @divisor = abs(@p - patindex(@aux,@cadena)+1)
set @parcial = @parcial + @j / (1.0 + cast(@divisor as money)/10)
end
if @limite > 1
set @limite = @limite - 1
set @i=@i+1
end
return @parcial * @bloques * @bloques /len(@cadena)/len(@patron)
END

Desde Aguadulce - España
Carlos Gomez

Respuesta Responder a este mensaje
#5 Carlos Gómez
20/06/2006 - 23:46 | Informe spam
Si señor, ya funciona perfectamente

muchisimas gracias

Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida