Oracle - Выберите, где поле должно содержать символы нижнего регистра

StackOverflow https://stackoverflow.com/questions/317576

Вопрос

У меня есть таблица users в базе данных 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);

Другие советы

Я думаю, что SQL BQ и второй SQL Джастина будут работать, потому что в этом сценарии:

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

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

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

Когда вы говорите upper(first_name) != first_name, всегда ли "first_name" относится к текущей строке, которую просматривает oracle?Сначала я боялся использовать этот метод, потому что боялся, что в конечном итоге мне придется присоединить эту таблицу к самой себе, но из-за того, что вы оба написали 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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top