Ответ 1
Как насчет этого:
select id, first, last from mytable
where first != upper(first) or last != upper(last);
У меня есть таблица, пользователи, в базе данных Oracle 9.2.0.6. Два из полей: varchar - last_name и first_name.
Когда строки вставляются в эту таблицу, поля имени и фамилии должны быть во всех верхних строках, но некоторые значения в этих двух полях являются смешанными.
Я хочу запустить запрос, который покажет мне все строки в таблице, в которых есть имена или имена с строчными буквами.
Я искал сеть и нашел REGEXP_LIKE, но это должно быть для более новых версий oracle - для меня это не работает.
Еще одна вещь, которую я пробовал, заключалась в том, чтобы перевести "abcde... z" на "$$$$$... $", а затем искать "$" в моей области, но должен быть лучший способ?
Спасибо заранее!
Как насчет этого:
select id, first, last from mytable
where first != upper(first) or last != upper(last);
Я думаю, что BQ SQL и Justin второй SQL будут работать, потому что в этом случае:
first_name last_name
---------- ---------
bob johnson
Bob Johnson
BOB JOHNSON
Я хочу, чтобы мой запрос возвращал первые 2 строки.
Я просто хочу убедиться, что это будет эффективный запрос, хотя в моей таблице содержится 500 миллионов строк.
Когда вы говорите upper (first_name)!= first_name, это "first_name", всегда относящееся к текущей строке, на которую смотрит оракул? Сначала я боялся использовать этот метод, потому что боялся, что я вступлю в эту таблицу сам по себе, но они, как вы оба написали SQL, показывают, что проверка равенства работает только по строкам, что будет работать для меня.
Если вы ищете Oracle 10g или выше, вы можете использовать приведенный ниже пример. Подумайте, что вам нужно найти строки, в которых любая буква в столбце имеет строчные буквы.
Column1
.......
MISS
miss
MiSS
В приведенном выше примере, если вам нужно найти значения miss
и miss
, вы можете использовать следующий запрос
SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]');
SELECT *
FROM mytable
WHERE FIRST_NAME IN (SELECT FIRST_NAME
FROM MY_TABLE
MINUS
SELECT UPPER(FIRST_NAME)
FROM MY_TABLE )
Попробуйте следующее:
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
для SQL-сервера, где настройка сопоставления базы данных нечувствительна к регистру, использует следующее:
SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1))