非字母名称字段的 SQL 查询
Posted
技术标签:
【中文标题】非字母名称字段的 SQL 查询【英文标题】:SQL Query For Non-Alphabet name field 【发布时间】:2011-08-24 09:33:48 【问题描述】:我在员工表中有一个名称列。我想查看所有具有字母以外字符的员工姓名。对此最好的查询是什么?
另一个要求:返回所有没有一个字母的名字。
注意:在这种情况下,任何其他英文字母都不被视为字母。在我的场景中,文本“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,'é ü')
方法 1 和方法 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]%'
谢谢
李乔
【问题讨论】:
定义“字母”。不清楚您是否希望ü
等被视为字母。
感谢您帮助澄清问题。字母在上面定义。
参考:***.com/questions/7157389/…
【参考方案1】:
您需要使用 LIKE 但与 COLLATE(用于 SQL Server)一起忽略重音符号
WHERE
EmployeeName COLLATE Latin1_General_CI_AI LIKE '%[^a-z]%
“André Müller”是一个有效的名称,但会是“假”,因为 é 或 ü 都不在 a-z 范围内
【讨论】:
不确定我错过了什么。 Latin1_General1_AI_CI 不工作。Latin1_General_CI_AS 工作 @Lijo: select * from fn_helpcollations() 显示了 Latin1_General_CI_AI。你需要一个 AI 排序规则。 @Lijo:你不需要 COLLATE 它你只想要英文 a-z 和重音字符应该被拒绝【参考方案2】:不知道我是否正确理解了你的问题,但我认为这可能是一个解决方案:
SELECT *
FROM employee
WHERE name LIKE '%[^a-zA-Z]%'
【讨论】:
需要允许重音字母:检查我的答案 这取决于作者对“字母”的想法。我假设他需要找到所有姓名中的字符不是英文字母的员工。【参考方案3】:!! 2021 年快乐 :-) 请注意上述所有解决方案 - 示例中的测试数据包含空格,这会使测试失败。
TEST TEST TEST TEST TEST 首先测试 - 这取决于您的语言环境和默认值;对于美国,这将有助于找到所有重音字符(在任何位置(在边界或中间,仅重音或与 ABC 混合,中间有空格等)。有些人缺少LIKE
范围的各个方面否定。
有问题的列应定义为 NVARCHAR - 即使在运行中进行 CAST 也行不通,因此需要第一步。然后我们使用正确的排序规则转换回 VARCHAR:
SELECT SERVERPROPERTY('Collation') DefaultCol, *, cast(nA as varchar(32)) collate SQL_Latin1_General_Cp1251_CS_AS nAX
FROM (
SELECT EmpName ,CAST(EmpName AS NVARCHAR(200)) nA FROM Employee --#1 step
)X
WHERE cast(nA as varchar(32)) collate SQL_Latin1_General_Cp1251_CS_AS <> nA
【讨论】:
【参考方案4】:您可以使用 t-sql 的 Ascii 和 Left 函数来执行此操作。只需找到左 1 个字符并使用 ascii values 检查它们是否不在小写和大写 ascii 值的范围之间。
【讨论】:
【参考方案5】:实际上,这取决于您所说的“字母”是什么意思。在简单的情况下,这将列出员工中名称列包含“A-Z”以外的字符的所有行:
SELECT
*
FROM
employee
WHERE
name LIKE '%[^A-Z]%'
您可以根据需要扩展它,例如LIKE '%[^ A-Z]%
将检查 A-Z 和空格以外的字符。要处理其他字母,包括重音字符等,您可以将它们包含在内,也可以根据需要考虑使用collation 进行处理。
有关更多信息,请参阅LIKE clause help for T-SQL 中有关模式匹配的详细信息。
【讨论】:
【参考方案6】:您可以使用patindex 并包含您的字母表中的任何字符。这里有一些瑞典字符和space
。
select *
from Emp
where patindex('%[^A-ZÅÄÖ a-zåäö]%', Name) > 0
编辑:
感谢@gbn 的评论,我现在知道您可以使用 collate 来简化表达式。 CI
负责大小写,AI
负责重音。
where patindex('%[^A-Z ]%', Name COLLATE Latin1_General_CI_AI) > 0
【讨论】:
整理消除了了解所有重音字符的需要:我使用瑞士德语 KB,看不到/不知道瑞典或西班牙重音字母。 AVG 英国或美国代码猴子的机会更少...... @gbn - 谢谢。从来没想过。以上是关于非字母名称字段的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章