texto - recorrer string sql server
¿Cómo identificar el texto Unicode en sql? (2)
Table1 tiene una columna nvarchar llamada umsg que contiene texto unicode y también inglés.
Quiero saber el texto en inglés presente en la columna umsg.
select *
from table1
where
RDate >=''01/01/2014'' and RDate < ''09/26/2017''
and umsg = convert(varchar(max), umsg)
Utilicé la consulta anterior que funciona bien en el idioma regional, pero falla un poco. Supongamos que col contiene texto como ''ref no à © tÃ''. Creo que el mensaje anterior es unicode, si utilicé la consulta anterior, it / sql me muestra como inglés no unicode. Cómo manejar esto.
Table :
Id Date Umsg
1 2017-09-12 00:00:00.000 The livers detoxification processes.
2 2017-09-11 00:00:00.000 Purposely added 1
3 2017-09-10 00:00:00.000 फेंगशुई के छोटे-छोटे टिप्स से आप जीवन की विषमताओं से स्वयं को बचा सकते
4 2017-09-17 00:00:00.000 तनाव एक लाइलाज बीमारी कतई नहीं है। कुछ लोग तनाव को आसानी से झेल लेते ह
5 2017-09-17 00:00:00.000 ref no été
Arriba están los datos presentes en mi mesa. Pero quiero datos / resultados como:
Id Date Umsg
1 2017-09-12 00:00:00.000 The livers detoxification processes.
2 2017-09-11 00:00:00.000 Purposely added 1
No contestó lo que quiere en caso de que haya algunos caracteres Unicode y algunos Ascii en la misma cadena, por lo que le doy 1 idea y 1 solución para el caso si solo quiere encontrar filas "puros en inglés" o "mixtas".
Necesitas una tabla de números naturales para hacer esto. En caso de que no tengas una tabla de este tipo, puedes generarla así:
select top 1000000 row_number() over(order by getdate()) as n
into dbo.nums
from sys.messages m1 cross join sys.messages m2;
alter table dbo.nums alter column n int not null;
alter table dbo.nums add constraint PK_nums_n primary key(n);
Ahora que tienes una tabla de números naturales vamos a descomponer tus cadenas en caracteres individuales para verificar si ascii(character)
= unicode(character)
:
declare @t table(col Nvarchar(200));
insert into @t values
(N''ref no été''), (N''The livers detoxification processes.''), (N''फेंगशुई के छोटे-छोटे टिप्स से आप जीवन की विषमताओं से'')
select t.col, n, substring(t.col, n, 1) as nth_character,
ascii(substring(t.col, n, 1)) as ascii,
unicode(substring(t.col, n, 1)) as uni
from @t t join dbo.nums n
on n.n <= len(t.col); -- this is to give you an idea how to see if it''s unicode character or ascii
with cte as
(
select t.col, n, substring(t.col, n, 1) as nth_character,
ascii(substring(t.col, n, 1)) as ascii,
unicode(substring(t.col, n, 1)) as uni
from @t t join dbo.nums n
on n.n <= len(t.col)
)
select col,
case
when sum(case when ascii = uni then 1 else 0 end) = count(*) then ''English only''
else ''Not only English''
end as eng_or_not
from cte
group by col -- row level solution
La primera parte del código muestra su cadena carácter por carácter junto con el código ascii ande unicode del personaje: donde son iguales es su carácter ascii.
La segunda parte solo verifica si todos los personajes son ascii.
verifique abajo:
;WITH CTE
AS (
SELECT ID,
DATE,
umsg,
CASE
WHEN(CAST(umsg AS VARCHAR(MAX)) COLLATE SQL_Latin1_General_Cp1251_CS_AS) = umsg
THEN 0
ELSE 1
END HasSpecialChars
FROM <table_name>)
SELECT ID,
DATE,
umsg
FROM CTE
WHERE Date >= ''01/01/2014''
AND Date < ''09/26/2017''
AND HasSpecialChars = 0;
Salida deseada :
ID DATE umsg
1 2017-09-12 00:00:00.000 The livers detoxification processes.
2 2017-09-11 00:00:00.000 Purposely added 1
Espero que te ayude.