Лучший способ обобщить огромный список СЛУЧАЙ, КОГДА - PullRequest
1 голос
/ 10 июля 2020

Предположим, у меня есть таблица со строкой, и я хочу создать агрегацию этой таблицы, сгруппировав разные строки в «категорию». Чтобы понять, к какой категории относится каждая строка, у меня есть список возможностей, которые я могу суммировать следующим образом:

CASE WHEN string = 'aaa' THEN 'cat_aaa'

CASE WHEN string = 'bbb' THEN 'cat_bbb'

[...]

CASE WHEN string LIKE '% abc%' THEN 'cat_ab c'

Теперь, список может быть очень большим и может потребовать обновления, поэтому я не хочу составлять бесконечный список СЛУЧАЙ КОГДА. Вместо этого я хотел бы иметь таблицу со строкой, используемой для сравнения, и соответствующей категорией.

Итак, давайте предположим, что у вас есть первая таблица со всеми строками:

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

и другая таблица

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

Если бы все они были = condition, я мог бы просто объединить две строки. Однако, в зависимости от типа string_comparison, мне может потребоваться сравнение LIKE. Есть ли у вас какие-нибудь sh идеи, как решить эту ситуацию? Я бы не хотел присоединяться к этим двум столам на основе НРАВИТСЯ из-за выступлений. Есть ли возможность использовать регулярные выражения в строке для решения этой проблемы?

Я использую красное смещение.

1 Ответ

0 голосов
/ 10 июля 2020

A 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

Примечание: вы не пометили вопрос с помощью СУБД, которую используете, поэтому я привел пример, используя Postgresql s position функция. Другие СУБД должны иметь функции с такими же функциональными возможностями, хотя их названия могут отличаться.

...