sql—总结大量案例的最佳方法

lf5gs5x2  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(222)

假设我有一个带有字符串的表,我想通过在“category”中将不同的字符串分组来创建这个表的聚合。为了理解将每个字符串分配到哪个类别,我有一个可能性列表,我可以总结如下:
字符串='aaa'然后是'cat\u aaa'时的大小写
字符串='bbb'然后是'cat\u bbb'时的大小写
[...]
字符串(如“%%”和“cat\u ”)时的大小写
现在,这个列表可能非常庞大,可能需要更新,所以我不想在任何时候列出无限的案例。我希望有一个表,其中包含用于比较的字符串和相应的类别。
假设有一个包含所有字符串的第一个表:

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

还有一张table

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

如果它们都是=条件,我就可以把两条弦连起来。但是,根据字符串比较的类型,我可能需要执行类似的比较。你对如何解决这种情况有什么新的想法吗?因为表演的原因,我不想把两张table放在同一张table上。有没有可能在字符串上使用正则表达式来解决这个问题?
我在用红移。

vql8enpb

vql8enpb1#

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应该具有相同功能的函数,尽管它们的名称可能不同。

相关问题