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

时间:2016-10-31 12:19:04

标签: sql-server-2012

[Plate_No]中的[my_Table]列包含希腊和外国车辆的车牌号码。一般希腊板块数字仅包含希腊字符,外国板块仅包含拉丁字符。

现在,有些行包含带有混合字符的板号并且不正确。

例如:

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

正如您所看到的,板数在视觉上是相同的,但是当应用LOWER时,差异是显而易见的。

如何检测到这些不正确的行?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

这是一种在列排序规则为Greek_CI_AS时有效的方法:

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

INSERT INTO @my_Plates (
    Plate_No
)
SELECT UPPER(N'aaa1234')
UNION ALL
SELECT UPPER(N'ααα1234')
UNION ALL
SELECT UPPER(N'aαa1234')

SELECT  Plate_No, LOWER(Plate_No) 
FROM    @my_Plates
WHERE   Plate_No <> CAST(Plate_No AS varchar(50)) COLLATE Latin1_General_CI_AS
AND     Plate_No LIKE '%[A-Z]%'

这可能无法在大型数据集上表现良好 - WHERE条件都不能在Plate_No上使用索引。

答案 1 :(得分:0)

这是使用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