确定值的语言:阿拉伯语英语 SQL netezza

Determining the language of a value: Arabic English SQL netezza

如果是阿拉伯语或英语,我需要为列值指定语言,并且我的值有混合语言,它将被视为阿拉伯语

我尝试了下面的代码来区分两种语言,但它没有用,总是给我 Arabic

SELECT SCRIPT, CASE WHEN script like N'[A-Z]%' THEN 'English' ELSE 'Arabic' END AS LANGUAGE
FROM
    tbl

例如:

Value
هذا مثال على ذلك
This Is Example
هذا مجرد Examle
يرجى الضغط على الرابط https://www.google.com/
هذا مثال على ذلك 123456

添加语言列后的预期结果

SCRIPT Language
هذا مثال على ذلك Arabic
This Is Example English
هذا مجرد Examle Arabic
يرجى الضغط على الرابط https://www.google.com/ Arabic
هذا مثال على ذلك 123456 Arabic

尝试使用正则表达式:

SELECT SCRIPT,
       (CASE WHEN REGEXP_LIKE(script, N'^[A-Z]'
             THEN 'English' ELSE 'Arabic'
        END) AS LANGUAGE
FROM tbl

我不认为 N​​etezza 扩展 LIKE 来支持字符范围。上面是一个正则表达式,用于检查第一个字符是否在 A-Z 范围内。我不确定这是确定您想要什么的最佳方法;但考虑到逻辑,您可能还想检查小写字母。

编辑:

如果你想要只有个英语字符,你可以这样做:

SELECT SCRIPT,
       (CASE WHEN REGEXP_LIKE(script, N'^[A-Za-z0-9 ]+$'
             THEN 'English' ELSE 'Arabic'
        END) AS LANGUAGE
FROM tbl

如果您关心标点符号,您可能希望包含其他字符。

如果第一个字符是语言的指示符,那么更全面的方法是检查您的列的语言。

SELECT c1, 
       CASE 
         WHEN unicode(c1) BETWEEN String_to_int('600', 16) AND string_to_int('6FF', 16)
              OR unicode(c1) BETWEEN string_to_int('750', 16) AND string_to_int('77F', 16)
              OR unicode(c1) BETWEEN string_to_int('8A0', 16) AND string_to_int('8FF', 16)
              -- add more unicode range checks here
          THEN 'Arabic' 
          ELSE 'English' 
       END AS language 
FROM  ... ; 

这将导致

                      C1                       | LANGUAGE
-----------------------------------------------+----------
 هذا مثال على ذلك                              | Arabic
 This Is Example                               | English
 هذا مجرد Examle                               | Arabic
 يرجى الضغط على الرابط https://www.google.com/ | Arabic
 هذا مثال على ذلك 123456                       | Arabic

如果用例是一个以 Latin9 / Ascii 开头然后具有其他 unicode 字符的字符串,那么使用 the unicodes function 非非 sql post 处理可能有助于更全面解决方案

 select unicodes(c1, 32, 'hex') from ..;

会给出-

000647 000630 000627 000020 000645 00062B 000627 000644 000020 000639 000644 000649 000020 000630 000644 000643
 000054 000068 000069 000073 000020 000049 000073 000020 000045 000078 000061 00006D 000070 00006C 000065
 000647 000630 000627 000020 000645 00062C 000631 00062F 000020 000045 000078 000061 00006D 00006C 000065
 00064A 000631 00062C 000649 000020 000627 000644 000636 00063A 000637 000020 000639 000644 000649 000020 000627 000644 000631 000627 000628 000637 000020 000068 000074 000074 000070 000073 00003A 00002F 00002F 000077 000077 000077 00002E 000067 00006F 00006F 000067 00006C 000065 00002E 000063 00006F 00006D 00002F
 000647 000630 000627 000020 000645 00062B 000627 000644 000020 000639 000644 000649 000020 000630 000644 000643 000020 000031 000032 000033 000034 000035 000036