2011-10-20 7 views
1

У меня есть такой postresql стол:Как я могу сделать регистр без учета регистра в postresql?

id user year  id_card_no 

1 john 1995  AZE546546  
2 ali  2002  464645AZE    
3 hayat 2007  4454AZE45455    
4 jack 2008  455454554 

Я хочу, чтобы получить все значения, которые имеют AZE слово внутри колонны (id_card_no) поле. Я использовал этот запрос:

SELECT * FROM table_name WHERE id_card_no LIKE '%AZE%' 

Но я получил первое поле, которое id равно 1. Как я могу получить все столбцы, у которых есть AZE слово внутри id_card_no?

+0

С учетом данных образца и запроса вы должны получить и другие строки. Вы уверены, что показываете нам правильный пример? (И вы, вероятно, имеете в виду: * Как я могу получить все ** строки **, которые имеют .. *, правильно? –

ответ

3

Для ведения регистрозависимости как у вас есть два варианта:

SELECT * 
FROM table_name 
WHERE id_card_no ILIKE '%AZE%' 

или

SELECT * 
FROM table_name 
WHERE lower(id_card_no) LIKE lower('%AZE%') 
+0

Отличный ответ. Могу ли я использовать 2 запроса вместе? ?: SELECT * FROM table_name WHERE id_card_no ILIKE '% AZE%' или ILIKE '% AZA%' – Someone

+0

Конечно, почему бы вам просто не попробовать? –

+1

как LIKE и ILIKE на самом деле являются операторами PostgreSQL, вы также можете использовать 'id_card_no ilike ANY (ARRAY ['% AZE% ','% AZA% ']) ' – valgog

1

Этот вид выбора не масштабируется, поскольку они обречены на последовательные сканирование по предварительной 9.1 PostgreSQL.

Если ваш стол будет большим, то лучше, что вы читаете о индексах триграмм и возможностях их использования в 9.1 для ускорения поиска подстроки.

Если вы не используете PostgreSQL 9.1, вам следует подумать о создании индекса GIN/GIST для массивов подстрок, а затем использовать операторы доступа к массиву, чтобы сделать сканирование индексов.

Смежные вопросы