非字母名称字段的 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_helpcollat​​ions() 显示了 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 的评论,我现在知道您可以使用 collat​​e 来简化表达式。 CI 负责大小写,AI 负责重音。

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

【讨论】:

整理消除了了解所有重音字符的需要:我使用瑞士德语 KB,看不到/不知道瑞典或西班牙重音字母。 AVG 英国或美国代码猴子的机会更少...... @gbn - 谢谢。从来没想过。

以上是关于非字母名称字段的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

用一条SQL语句查询出所有员工姓名的字母前三位

database 如何查询某个字段以某个字母开头的数据

用一条sql语句查询表中字段的所有首字母大写

oracle 如何查询字段第一位不是字母,条件如何写

mysql获取字段拼音各首字母的问题

SQL 查询一表所有数据 有重复的按时间取第一条