несколько как на одном столбце DB2 - PullRequest
2 голосов
/ 24 апреля 2009

Я пытаюсь запросить что-то вроде

select emp_id from dept.employee where
  firstname like '%sam%' or 
  firstname like '%SAM%' or
  firstname like '%will%' or
  firstname like '%WILL%'

Можно ли поместить это в регулярное выражение что-то вроде

select emp_id from dept.employee where
  firstname like '%sam|SAM|will|WILL%'

или

select emp_id from dept.employee where
  upper(firstname) like '%sam%' or
  upper(firstname) like '%will%'

Я использую DB2 UDB9.

Ответы [ 2 ]

1 голос
/ 24 апреля 2009

К сожалению, в DB2 нет немедленной функции Regex. Но возможно иметь внешнюю пользовательскую функцию (вызывающую внешнюю функцию CLI, .NET или Java), которая реализует регулярные выражения. Вот готовый пример от IBM:

http://www.ibm.com/developerworks/data/library/techarticle/0301stolze/0301stolze.html

0 голосов
/ 24 апреля 2009

Это плохой пример или плохой дизайн базы данных: -).

Вы, вероятно, не должны хранить первые (или любые) имена каким-либо образом, который потребует от вас использования LIKE. Вы должны иметь в виду, что таблицы почти всегда читаются гораздо чаще, чем написаны, и оформляют соответственно.

Это означает, что вы хотите, чтобы стоимость была при вставке или обновлении, а не при выборе. Функции для каждой строки, такие как upper(name), плохо масштабируются до подходящих баз данных корпоративного класса.

На мой взгляд, для DB2 вы должны иметь следующее:

  • триггер вставки / обновления, который удаляет начальные и конечные пробелы из имени (и фамилии).
  • сгенерированный столбец, который будет содержать имена в верхнем регистре (это использует больше памяти, но обычно это лучше, чем тратить время). Я не уверен, что UDB9 сгенерировал столбцы (DB2 / z имеет), но вы можете сделать это в том же триггере вставки / обновления. По сути, это дополнительный столбец, для которого всегда задана заглавная версия другого поля.
  • индекс сгенерированного столбца, а не исходного столбца.

Таким образом, ваши выборы будут кричать вместе с такими запросами, как (большие и некрасивые, но эффективные):

select * from tbl
where generatedname = 'SAM'
or    generatedname = 'SAMUEL'
or    generatedname = 'SAMANTHA'
or    generatedname = 'WILL'
or    generatedname = 'WILLIAM'
or    generatedname = 'WILLOMENA'

или (менее большой и некрасивый, такой же эффективный и более близкий к исходному запросу по назначению):

select * from tbl
where generatedname like 'SAM%'
or    generatedname like 'WILL%'

используя всю мощь оптимизатора запросов (DB2 и другие СУБД, я думаю, все еще могут легко оптимизировать 'XX%', если поле проиндексировано).

Я не большой поклонник использования LIKE для любых приличных размеров столов, хотя иногда нет большого выбора. Я не могу вспомнить ни одной жизнеспособной ситуации, в которой вы хотели бы искать "%SAM%", и это приводит к невозможности использовать оптимизатор в полной мере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...