Sql server 2012 sql:检测包含多种语言的字符串

Sql server 2012 sql:检测包含多种语言的字符串,sql-server-2012,Sql Server 2012,[my_Table]中的[Plate_No]列包含希腊和外国车辆的车牌号。一般来说,希腊车牌号只包含希腊字符,外国车牌号只包含拉丁字符 现在,有些行包含混合字符的车牌号,这是不正确的 例如: DECLARE @my_Plates AS TABLE ( Plate_No NVARCHAR(50) ) INSERT INTO @my_Plates ( Plate_No ) SELECT 'AAA1234' UNION ALL SELECT 'ΑΑΑ1234' UNION ALL SE

[my_Table]中的[Plate_No]列包含希腊和外国车辆的车牌号。一般来说,希腊车牌号只包含希腊字符,外国车牌号只包含拉丁字符

现在,有些行包含混合字符的车牌号,这是不正确的

例如:

DECLARE @my_Plates AS TABLE (
   Plate_No NVARCHAR(50)
)

INSERT INTO @my_Plates (
    Plate_No
)
SELECT 'AAA1234'
UNION ALL
SELECT 'ΑΑΑ1234'
UNION ALL
SELECT 'AΑA1234'

SELECT Plate_No, LOWER(Plate_No) AS LC_Plate_No
FROM @my_Plates
结果:

Plate_No | LC_Plate_No
---------------------
AAA1234  | aaa1234      <-- correct
ΑΑΑ1234  | ααα1234      <-- correct
AΑA1234  | aαa1234      <-- incorrect
正如您所看到的,车牌号在视觉上是相同的,但当应用较低的车牌号时,差异是明显的

如何检测这些不正确的行


任何帮助都将不胜感激。

当列排序规则为希腊文时,以下是一种有效的方法:

这在大型数据集上可能不会很好地执行-这两种情况都不能使用图版上的索引。

这里有一个使用LIKE的解决方法。对于10.000.000+行来说,它很重,但这没关系,因为这只是一次检查以进行更正

SELECT
Plate_No
, LOWER(Plate_No) AS LC_Plate_No
, (
    CASE WHEN Plate_No LIKE '%[α-ω]%' AND Plate_No LIKE '%[a-z]%'
        THEN '0'
        ELSE '1'
    END
) AS isCorrect
FROM @my_Plates

我编辑了您的示例数据插入语句,使其在结果部分生成输出-原始语句对我不起作用。奇怪的事情。从stackoverflow复制并粘贴到我的SSMS很好。这不会从我的示例返回任何行。@armen-这和我们从问题中的示例代码复制/粘贴所经历的差异都表明,我们环境的排序规则设置可能存在差异。exec sp_helpsort为您返回什么?希腊文,不区分大小写,区分重音,不区分假名类型,不区分全半角-insensitive@armen-查看我的更新。通过设置车牌号的排序规则,我可以复制您看到的行为,并修改了我的答案以解决它。谢谢,它工作得很好。虽然我刚刚找到了另一种解决问题的方法。
SELECT
Plate_No
, LOWER(Plate_No) AS LC_Plate_No
, (
    CASE WHEN Plate_No LIKE '%[α-ω]%' AND Plate_No LIKE '%[a-z]%'
        THEN '0'
        ELSE '1'
    END
) AS isCorrect
FROM @my_Plates