Oracle - выберите, где поле имеет строчные буквы

У меня есть таблица, пользователи, в базе данных Oracle 9.2.0.6. Два из полей: varchar - last_name и first_name.

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

Я хочу запустить запрос, который покажет мне все строки в таблице, в которых есть имена или имена с строчными буквами.

Я искал сеть и нашел REGEXP_LIKE, но это должно быть для более новых версий oracle - для меня это не работает.

Еще одна вещь, которую я пробовал, заключалась в том, чтобы перевести "abcde... z" на "$$$$$... $", а затем искать "$" в моей области, но должен быть лучший способ?

Спасибо заранее!

Ответы

Ответ 1

Как насчет этого:

select id, first, last from mytable
where first != upper(first) or last != upper(last);

Ответ 2

Я думаю, что BQ SQL и Justin второй SQL будут работать, потому что в этом случае:

first_name        last_name
----------        ---------
bob               johnson
Bob               Johnson
BOB               JOHNSON

Я хочу, чтобы мой запрос возвращал первые 2 строки.

Я просто хочу убедиться, что это будет эффективный запрос, хотя в моей таблице содержится 500 миллионов строк.

Когда вы говорите upper (first_name)!= first_name, это "first_name", всегда относящееся к текущей строке, на которую смотрит оракул? Сначала я боялся использовать этот метод, потому что боялся, что я вступлю в эту таблицу сам по себе, но они, как вы оба написали SQL, показывают, что проверка равенства работает только по строкам, что будет работать для меня.

Ответ 3

Если вы ищете Oracle 10g или выше, вы можете использовать приведенный ниже пример. Подумайте, что вам нужно найти строки, в которых любая буква в столбце имеет строчные буквы.

Column1
.......
MISS
miss
MiSS

В приведенном выше примере, если вам нужно найти значения miss и miss, вы можете использовать следующий запрос

SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]');

Ответ 4

 SELECT * 
 FROM mytable 
 WHERE FIRST_NAME IN (SELECT FIRST_NAME 
                      FROM MY_TABLE
                      MINUS 
                      SELECT UPPER(FIRST_NAME) 
                      FROM MY_TABLE )

Ответ 5

Попробуйте следующее:

SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]','c'); => Miss, miss lower text
SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[A-Z]','c'); => Miss, MISS upper text

Ответ 6

для SQL-сервера, где настройка сопоставления базы данных нечувствительна к регистру, использует следующее:

SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1))