Sql server 2012 sql:检测包含多种语言的字符串
[my_Table]中的[Plate_No]列包含希腊和外国车辆的车牌号。一般来说,希腊车牌号只包含希腊字符,外国车牌号只包含拉丁字符 现在,有些行包含混合字符的车牌号,这是不正确的 例如: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
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