总结大量案例的最佳方式



假设我有一个带有字符串的表,我想通过将不同的字符串分组到"category"中来创建该表的聚合。为了理解将每个字符串分配给哪个类别,我有一个可能性列表,可以总结如下:

字符串="aaa"然后为"cat_aaa"时的大小写

CASE WHEN string='bbb'THEN'cat_bb'

[…]

当字符串像"%abc%"然后是"cat_abc"时大小写

现在,这个列表可能非常庞大,可能需要更新,所以我不想做一个无限的CASE WHEN列表。相反,我想要一个带有用于比较的字符串和相应类别的表。

因此,让我们假设有一个包含所有字符串的第一个表:

TABLE A
=======
string
--------
aaa
bbb
aaa
aaa
aaa
dabc
fabc
------

和另一个表

TABLE B
=======
string_comparison | category
aaa         | cat_aaa
bbb         | cat_bbb
%abc%        | cat_abc

如果它们都=条件,我就可以把这两个字符串连接起来。但是,根据字符串比较的类型,我可能需要执行LIKE比较。你对如何解决这种情况有什么新的想法吗?由于表演原因,我不想在like的基础上加入这两张桌子。有没有可能在字符串上使用正则表达式来解决这个问题?

我正在使用红移。

没有通配符的like实际上与=相同,任何合理的优化器都应该正确处理它,所以我不会想太多,只尝试使用like:

SELECT   category, COUNT(*)
FROM     a
JOIN     b ON string LIKE string_comparison
GROUP BY category

如果你真的很关心like运算符的性能,你可以试着检查string_comparison中是否没有通配符并将其短路,但我怀疑它是否会比直接使用like更快:

SELECT   category, COUNT(*)
FROM     a
JOIN     b ON (POSITION('%' IN string_comparison) > 0 AND
POSITION('_' IN string_comparison) > 0 AND 
string LIKE string_coparison) OR
string = string_comparison
GROUP BY category

注意:您没有用正在使用的RDBMS标记这个问题,所以我举了一个使用Postgresql的position函数的例子。其他RDBMS应该具有相同功能的函数,尽管它们的名称可能不同。

最新更新