2017-10-03 3 views
0

テーブル1には、ユニコードテキストを含むumsgという名前のnvarchar列があります。sqlのUnicodeテキストを識別する方法は?

umsgの列にある英語のテキストを探したいと思います。

select * 
from table1 
where 
    RDate >='01/01/2014' and RDate < '09/26/2017' 
    and umsg = convert(varchar(max), umsg) 

上記のクエリは、地域の言語で問題なく使用できますが、失敗することがあります。 colに 'ref noété'のようなテキストが含まれているとします。 上記のメッセージはユニコードですが、上記のクエリを使用した場合、/ sqlは英語ではなくunicodeを表示しています。

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é 

上記は私のテーブルにあるデータです。

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 
+2

@Jui Test、where whereにはvarcharの代わりにnvarcharを使用してください。 convert(nvarchar(max)、umsg)。 – RGS

+0

はい、私はSQL Server 2012を使用しています –

+0

なぜnvarcharの代わりにvarcharを使用しますか –

答えて

3

チェック:

;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; 

所望の出力:

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  

希望、それはあなたを助けるでしょう。

1

あなたは、いくつかのUnicodeと同じ文字列内のいくつかのASCII文字がある場合には、あなたが欲しいものを答えなかったので、私はあなたに1つのアイデアとケースのための1つの溶液を得: は、しかし、私はデータ/出力は次のようにしたいですあなたが "純粋な英語"または "混合"の行だけを探したいならば。今、あなたは我々がしようとしている自然数のテーブルを持っていることを

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); 

を:

は、あなたがこのようにそれを生成することができますが、そのようなテーブルを持っていないこの.INケースを行うために自然数のテーブルを必要とします彼らは同じことのASCIIです:コードの最初の部分が文字のアスキーおよびeのUnicodeコードと一緒に文字によってあなた、あなたの文字列の文字を示し

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 

ascii(character) = unicode(character)かどうかを確認するために、単一の文字にあなたの文字列を分解するキャラクター。

2番目の部分は、すべての文字がasciiであるかどうかをチェックするだけです。以下

enter image description here

+0

、ありがとうございました。 –

関連する問題