SQL查询非字母名称字段

时间:2011-08-24 09:33:48

标签: .net sql sql-server tsql plsql

我在employee表中有一个Name列。我希望看到所有员工姓名都有字母以外的字符。对此最好的查询是什么?

另一个要求:返回所有甚至没有单个字母的名称。

注意:在这种情况下,任何其他英文字母都不被视为字母。在我的场景中,'AndréMüller'的文字中有一些非字母的字符。

DECLARE @Employee TABLE (EmpID INT, EmpName VARCHAR(1000))
INSERT INTO @Employee (EmpID, EmpName) VALUES(1,'André Müller')
INSERT INTO @Employee (EmpID, EmpName) VALUES(2,'Lijo')
INSERT INTO @Employee (EmpID, EmpName) VALUES(3,'88')
INSERT INTO @Employee (EmpID, EmpName) VALUES(4,'--@#')
INSERT INTO @Employee (EmpID, EmpName) VALUES(5,'é ü')

Aproach 1和Approach 2都在工作(感谢发布答案的人)。 哪个更好,为什么?

--Aproach 1
SELECT * FROM @Employee WHERE EmpName COLLATE Latin1_General_CI_AS LIKE '%[^a-z]%'

--Approach 2
SELECT * FROM @Employee WHERE EmpName LIKE '%[^a-zA-Z]%'

由于

Lijo

6 个答案:

答案 0 :(得分:5)

您需要使用LIKE但使用COLLATE(对于SQL Server)忽略重音

WHERE
   EmployeeName COLLATE Latin1_General_CI_AI LIKE '%[^a-z]%

“AndréMüller”是一个有效的名字,但是会“假”,因为é或ü都不在a-z范围内

答案 1 :(得分:2)

不知道我是否理解你的问题,但我认为这可能是一个解决方案:

SELECT *
FROM employee
WHERE name LIKE '%[^a-zA-Z]%'

答案 2 :(得分:1)

!! 2021 年快乐:-) 请注意上述所有解决方案 - 示例中的测试数据有空格,这会使测试失败。 测试 测试 测试 测试 测试这首先 - 这取决于您的语言环境和默认值;对于美国,这将用于查找所有带重音的字符(在任何位置(在边界或中间,只有重音或与 ABC 混合,中间有空格等...)。有些人缺少 {{1} } 范围否定。 有问题的列应定义为 NVARCHAR - 即使动态执行 CAST 也行不通,因此需要第一步。然后我们使用正确的排序规则转换回 VARCHAR

LIKE

答案 3 :(得分:0)

您可以使用t-sql的AsciiLeft函数来执行此操作。只需找到左边的1个字符并使用ascii values来检查它们是否在小范围和后面的ascii值之间。

答案 4 :(得分:0)

这取决于“字母表”的含义,真的。在简单的情况下,这将列出employee中名称列包含“A-Z”以外的字符的所有行:

SELECT 
   * 
FROM 
   employee
WHERE 
   name LIKE '%[^A-Z]%'

您可以根据需要展开,例如LIKE '%[^ A-Z]%将检查A-Z以外的字符和空格。要处理其他字母,包括重音字符等,您可以包含它们,或者根据需要使用collation来按摩。

有关详情,请参阅LIKE clause help for T-SQL

中有关模式匹配的详细信息

答案 5 :(得分:0)

您可以使用patindex并在字母表中包含您拥有的任何字符。这里有一些瑞典字符和space

select *
from Emp
where patindex('%[^A-ZÅÄÖ a-zåäö]%', Name) > 0

修改

感谢@gbn的评论我现在知道你可以使用整理来简化表达式。 CI负责处理案件,AI负责处理重音。

where patindex('%[^A-Z ]%', Name COLLATE Latin1_General_CI_AI) > 0