sql - dbms - रिलेशनल डेटाबेस क्या है




यूनिकोड पाठ को एसक्यूएल में कैसे पहचानें? (2)

नीचे जांचें:

;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      

आशा है इससे आपकी मदद होगी।

https://code.i-harness.com

टेबल 1 में उर्वर्च कॉलम का नाम उम्ज होता है जिसमें यूनिकोड पाठ होता है और कुछ समय अंग्रेज़ी भी होता है।

मैं umsg स्तंभ में अंग्रेजी पाठ को ढूंढना चाहता हूं।

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

मैंने उपरोक्त क्वेरी का उपयोग किया है जो क्षेत्रीय भाषा में ठीक काम करता है लेकिन कुछ समय असफल हो जाता है। मान लीजिए कि कर्नल में 'रेफरी नो à © tÃÆ'ÃÆ'Ã। एक € ™ Ã⠀ SA, एक © मुझे लगता है कि उपरोक्त संदेश, युनिकोड है, जैसे पाठ में शामिल है, अगर मैं क्वेरी के ऊपर प्रयोग किया है, तो यह / एसक्यूएल मुझे अंग्रेजी के रूप में यूनिकोड नहीं दिखा रहा है।

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

यदि आप कुछ यूनिकोड और कुछ आस्की अक्षर एक ही स्ट्रिंग में हैं, तो आप ने क्या जवाब नहीं दिया, इसलिए मैं आपको 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); 

अब जब आपके पास प्राकृतिक संख्याओं की एक तालिका है, तो हम अपने स्ट्रिंग को एकल वर्णों में विघटित करने जा रहे हैं ताकि 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

कोड का पहला भाग आपको चरित्र की आस्की और यूनिकोड कोड के साथ चरित्र के आधार पर दिखाता है: जहां वे वैसे ही आस्की वर्ण हैं

दूसरे भाग में जांचें कि सभी पात्रों का एस्सी है।







sql-server-2012