[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时,差异是显而易见的。
如何检测到这些不正确的行?
任何帮助都将不胜感激。
答案 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