Сравнить строки в Oracle - PullRequest
2 голосов
/ 23 декабря 2008

Мне нужно запросить таблицу значений для данной строки. Таблица чувствительна к регистру, но я хочу сделать ToLower () в сравнении.

Предположим, у меня есть таблица классов со следующими данными.

class    teacher
-----------------
Mat101   Smith
MAT101   Jones
mat101   Abram
ENG102   Smith

Мой запрос должен выглядеть примерно так:

Select teacher From classes where lower(class) = 'math101'

Это лучший способ сравнения?

Обновление

У меня нет контроля над базой данных или данными. Я потребитель только для чтения.

Ответы [ 6 ]

2 голосов
/ 23 декабря 2008

Этот метод требует, чтобы вы запустили 10gr2 или лучше.

Перед изменением сеанса:

SQL> WITH LETTERS AS
  2  (SELECT 'a' LETTER FROM DUAL UNION ALL
  3   SELECT 'b' LETTER FROM DUAL UNION ALL
  4   SELECT 'A' LETTER FROM DUAL UNION ALL
  5   SELECT 'B' LETTER FROM DUAL) 
  6  SELECT LETTER FROM LETTERS 
  7  WHERE LETTER = 'A';

L
-
A

SQL> 

Если вы можете изменить сеанс, вы можете сделать следующее:

SQL> ALTER SESSION SET NLS_SORT=BINARY_CI;

Session altered.

SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC;

Session altered.

SQL> WITH LETTERS AS
  2  (SELECT 'a' LETTER FROM DUAL UNION ALL
  3   SELECT 'b' LETTER FROM DUAL UNION ALL
  4   SELECT 'A' LETTER FROM DUAL UNION ALL
  5   SELECT 'B' LETTER FROM DUAL) 
  6  SELECT LETTER FROM LETTERS 
  7  WHERE LETTER = 'A';

L
-
a
A

Изменение сеанса, как сделано выше, приводит к тому, что база данных сортирует и сравнивает заглавную и строчную версии той же буквы, что и эквивалентные объекты. Для получения дополнительной информации, пожалуйста, см http://www.orafaq.com/node/91

НТН, Гейб

2 голосов
/ 23 декабря 2008

Вот дополнительная информация о функционально-ориентированных индексах (о чем Дэйв говорил выше):

0 голосов
/ 02 января 2009

Поскольку вы добавили, что являетесь пользователем базы данных только для чтения, метод best близок к тому, с чего вы начали:

Select teacher From classes where lower(class) = LOWER('math101')

Обратите внимание, что я добавил LOWER () к входному параметру, просто чтобы быть уверенным, что это строчные буквы. Кто-то может назвать это «ремнями и подтяжками» (он же избыточен); Я называю это хорошим оборонительным программированием.

0 голосов
/ 24 декабря 2008

Если варианты (Mat101, MAT101, mat101) ссылаются на одно и то же, они должны иметь один и тот же идентификатор.

В зависимости от объема данных, частоты обновлений, запросов и т. Д. Вы можете подумать о репликации данных в базу данных, которой вы управляете, на этапе очистки / стандартизации, встроенном в репликацию.

Хотя вы говорите: «Я не имею контроля над базой данных», если вы можете сделать запрос, вы окажете влияние на базу данных. Кто-то имеет контроль над базой данных, и, возможно, стоит по электронной почте / телефонному звонку сказать, что, если они добавят более низкий индекс () в этот столбец, это уменьшит влияние ваших запросов на базу данных.

Наконец, если варианты достаточно просты, вы можете попробовать

Select teacher From classes where class in (lower('mat101'), upper('mat101'), initcap('mat1010')). 
0 голосов
/ 23 декабря 2008

Нет; было бы лучше улучшить данные: создайте числовой идентификатор, который представляет эти, казалось бы, бессмысленные варианты класса (и, вероятно, связанную таблицу поиска для получения идентификатора). Используйте столбец ID в предложении where, и вы должны попасть в индексированный числовой столбец.

Если это не вариант, рассмотрите функциональный индекс на более низком уровне (класс).

Если это не вариант, и вопрос «лучший» строго относится к производительности, рассмотрите возможность денормализации и добавления столбца, который содержит более низкий (класс), возможно, заполненный триггером.

Если это не вариант, обновите данные так, чтобы они были строчными (и примите меры для вставки / обновления только данных строчных классов).

Если вы не можете обновлять данные таким образом, тогда ответ «возможно».

В любом случае, это нельзя назвать лучшим, если вы не проверили индексацию столбца.

0 голосов
/ 23 декабря 2008

Недостатком того типа запросов, о котором вы говорите, является то, что он не может использовать индекс класса (как поиск по индексу, то есть - он все еще может использоваться для быстрого полного сканирования индекса).

В современных версиях Oracle вы можете создать индекс для LOWER (класс), который затем можно будет использовать в этом запросе.

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