【发布时间】:2020-12-09 15:29:28
【问题描述】:
我想构建一个 sybase ASE 查询来匹配一个人的姓、名。名称有几种不同的格式。它可以是“姓氏,名字”,也可以是“姓氏,名字”(和名字之间没有空格)。我曾尝试使用像 'lastname[,][ ]firstname' 这样的名称,但它不起作用。我不能使用 lastname,%firstname ,因为它会与名字的任何字符匹配。有效字符要么是空格要么什么都没有。有什么建议吗?
【问题讨论】:
我想构建一个 sybase ASE 查询来匹配一个人的姓、名。名称有几种不同的格式。它可以是“姓氏,名字”,也可以是“姓氏,名字”(和名字之间没有空格)。我曾尝试使用像 'lastname[,][ ]firstname' 这样的名称,但它不起作用。我不能使用 lastname,%firstname ,因为它会与名字的任何字符匹配。有效字符要么是空格要么什么都没有。有什么建议吗?
【问题讨论】:
很遗憾,SAP/Sybase ASE 不提供对正则表达式模式的支持(例如,“零个或多个空格”),因此您只剩下几个基本选项...
union (all)两个查询:
select *
from names_table
where name like 'lastname, firstname'
union all
select *
from names_table
where name like 'lastname,firstname'
注意:两个查询都应该使用name 列上的索引,假设统计数据显示索引访问计划是最佳选择。
or 两个where 子句:
select *
from names_table
where (name like 'lastname, firstname' or name like 'lastname,firstname')
注意:这是否使用name 列上的索引将取决于索引和列的统计信息和/或实际查询的复杂性。
去掉空格并匹配剩下的:
select *
from names_table
where str_replace(name,' ',null) like 'lastname,firstname'
注意:在大多数情况下,这将禁用name 列上的索引。
从索引的角度...
如果您需要经常运行这种类型的查询,并且该查询的性能不能接受,您可以查看几个额外的索引选项:
ASE 基本上是在后台创建一个“系统”计算列,然后在该列上创建索引)【讨论】: