Sybase多子串搜索

时间:2012-07-03 18:50:22

标签: sql sybase-ase

我需要从文本字段中获取数据。输入并不都很漂亮......一些用户拼写不好或不一致。我需要寻找各种拼写错误以及替代术语。

我正在使用Sybase ASE,我想知道AND语句是否变得笨拙并且可能不是最佳的?这是一次尝试:

AND (entry_txt like 'fight' OR
    entry_txt like 'confron%' OR
    entry_txt like 'aggres%' OR
    entry_txt like 'grab' OR
    entry_txt like 'push' OR
    entry_txt like 'strike' OR
    entry_txt like 'hit' OR
    entry_txt like 'assa%')

随着我对附加条款以及一些专有名称添加一些新要求以及其中8-9个更多变化,它会变得更长!有没有更有效的方法来做到这一点,或者是吗?

我还读过LIKE应该用于部分字符串比较,IN用于来自集合的值。一组部分字符串的值怎么样?我可以/我应该在这里使用IN并且这有助于提高性能吗?

我正在搜索数以千计的文档,因此需要处理大量数据。

2 个答案:

答案 0 :(得分:1)

是的,对于那些没有%的人,您可以使用IN,对于其他人,您仍需要使用OR

它看起来像这样:

AND (entry_txt in ('fight', 'grab', 'push', 'strike', 'hit')
     OR entry_txt like 'confron%'
     OR entry_txt like 'aggres%'
     OR entry_txt like 'assa%')

答案 1 :(得分:0)

你实际上可以把"喜欢"表达式中的表达式 - 表中的另一列或变量。

因此,您可以创建一个包含一个varchar列的表,名为" like_expr"或类似的东西。

然后将所有上述表达式放入其中,包括没有%in的表达式,因为它们只会退化为相等操作。

就效率而言,如果index_txt被索引,那么可以使用索引。我认为Sybase会更容易加入到like_expr表而不是做很多很多OR,但两者都应该使用索引 - 这应该是一个单独的问题。)

create table abe(varchar(20))

插入abe值(' hello')

创建表abe2(l varchar(20))

插入abe2值(' h%')

从abe a select *中选择*(从abe2中选择1,其中a.a喜欢l)

您好