我在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
答案 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的Ascii和Left函数来执行此操作。只需找到左边的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