2011-08-24 81 views
1

我在employee表中有一个名称列。我希望看到所有员工姓名的字母不是字母。什么是最好的查询?对于非字母表名称字段的SQL查询

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

注意:在这种情况下,任何其他英文字母不被视为字母表。文本'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,'[email protected]#') 
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

+1

定义“字母表”。不清楚您是否希望将其他字母视为字母。 –

+0

感谢您帮助澄清问题。字母表在上面定义。 – Lijo

+0

参考:http://stackoverflow.com/questions/7157389/return-sql-rows-where-field-contains-only-non-alphanumeric-characters – Lijo

回答

5

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

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

“安德烈·米勒”是一个有效的名称,但将是“假”,因为无论é或ü不范围az

+0

@Lijo:修好了,对不起 – gbn

+0

不知道我错过了什么。 Latin1_General1_AI_CI不工作.Latin1_General_CI_AS正在工作 – Lijo

+0

@Lijo:select * from fn_helpcollat​​ions()显示我Latin1_General_CI_AI。你需要一个AI整理。 – gbn

0

您可以使用T-SQL的AsciiLeft功能来做到这一点。只要找到左边的1个字符,并使用ascii values来检查它们是否在小型和大写后面的ascii值之间。

+0

你可以请邮编? – Lijo

2

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

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

需要允许重音字母:请检查我的答案 – gbn

+0

这取决于作者在“字母表”中的想法。我认为他需要找到所有名字都不是英文字母的雇员。 – Jandrejc

0

这取决于你所说的“字母”什么,真的。在简单的情况下,这将列出员工在名称列包含比“A-Z”之外的字符的所有行:

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

可以将此作为必要的扩展,例如LIKE '%[^ A-Z]%将检查A-Z以外的字符和空格。为了应对其他字母,包括重音字符等,您可以包含它们,或者根据需要使用collation进行按摩。

有关更多信息,请参阅LIKE clause help for T-SQL中的模式匹配的详细信息。

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 
+2

Collat​​e不需要知道所有重音字符:我使用瑞士德语KB并且不能看/不知道瑞典语或西班牙语重音字母。 AVG英国或美国代码猴子有更少的机会... – gbn

+0

@gbn - 谢谢。从来没有想到这一点。 –