1

Тема: Оператор "LIKE"

Дуже просте питання, до вирішення якого не можу прийти :/ Який шаблон треба задати оператору LIKE щоб він вибрав стрічки, які мають 3 слова. Не більше, не менше. Я розумію як вибрати стрічки, які мають більше слів аніж 3 (4, 5, 6... не суттєво)

... LIKE '% % %'

Але як зробити шаблон для поставленої задачі щось не можу ніяк придумати :(

2

Re: Оператор "LIKE"

А LIKE це точно зможе? Думаю, тут без регулярних виразів не обійтися (RLIKE в MySQL, наприклад).

3

Re: Оператор "LIKE"

P.Y. написав:

А LIKE це точно зможе? Думаю, тут без регулярних виразів не обійтися (RLIKE в MySQL, наприклад).

Просто це завдання до уроку, в якому про регулярні вирази і натяку не було, а були звичайні оператори "BETWEEN, LIKE, IN".

4

Re: Оператор "LIKE"

Тоді, можливо, якось так:
[code=sql]... LIKE '% % %' AND NOT ... LIKE '% % % %'[/code]

Подякували: Faltfromoss1

5

Re: Оператор "LIKE"

Вам точно потрібен оператор Like? Це в завданні буквально сказано, чи ви самі так вирішили?
Якщо мова йде про результат вибірки, то для цього в MySQL є limit.

Але якщо мова йде про три шаблона для пошуку, то тут теж є варіанти. Наприклад, в одному записі є декілька слів, чи по одному в кожному рядку? Якщо по одному, то рівно для трьох слів підійде

select * from your_table where word = 'one' or word = 'two' or word = 'three'

Якщо в записах є декілька слів, то і тут все залежить від потреби. Вам потрібно задати три слова в одному запису? Тоді так

select * from your_table where word like '%one%two%three%'

Якщо треба інша послідовність слів, то з трьома словами варіантів не багато, можна й перерахувати через or.

Якщо можна щоб слова були в різних записах, тоді так.

select * from your_table where word like '%one%' or word like '%two%' or word like '%three%'

6

Re: Оператор "LIKE"

@Faltfromoss

1. Який рушій бази? У SQL Server є функція PATINDEX(), яка шукає по шаблону. Для інших рушіїв - гугліть.
2. LIKE вам тут не допоможе, якщо слова - не константні рядки.
3. Можна ще рахувати кількість пробілів (чи чим вони у вас розділяються, ті слова) у рядку.

7

Re: Оператор "LIKE"

ktretyak написав:
select * from your_table where word like '%one%two%three%'

Не прокатить. Сюди підійде як "one two three", так і "one two four three". Інакше то буде інша задача.

8

Re: Оператор "LIKE"

Bartash написав:
ktretyak написав:
select * from your_table where word like '%one%two%three%'

Не прокатить. Сюди підійде як "one two three", так і "one two four three". Інакше то буде інша задача.

Не прокатить що саме? =) Зрозуміло, що якщо стоїть задача щоб між словами не було інших слів, то замість % ставте пробіли.

9

Re: Оператор "LIKE"

ktretyak написав:
Bartash написав:
ktretyak написав:
select * from your_table where word like '%one%two%three%'

Не прокатить. Сюди підійде як "one two three", так і "one two four three". Інакше то буде інша задача.

Не прокатить що саме? =) Зрозуміло, що якщо стоїть задача щоб між словами не було інших слів, то замість % ставте пробіли.

Не прокатить, якщо слова - не конкретні, а просто як сутність, тобто пошук кількох будь-яких слів. Задача ТС наче так і стояла.

10

Re: Оператор "LIKE"

Bartash написав:

Не прокатить, якщо слова - не конкретні, а просто як сутність, тобто пошук кількох будь-яких слів. Задача ТС наче так і стояла.

Та думаю, що ТЗ геть розмите і автор теми досить слабо розуміє що саме йому потрібно.

11

Re: Оператор "LIKE"

Faltfromoss написав:

Просто це завдання до уроку, в якому про регулярні вирази і натяку не було, а були звичайні оператори "BETWEEN, LIKE, IN".

Якщо хочете конкретну відповідь, то не полінуйтеся хоча б текст "завдання" повністю написати, щоб люди не гадали, як дівки на судженого. А ще було б добре подивитись на сам урок, щоб орієнтуватись, які знання у вас вже є. Як на мене, то найкраще регулярками.

12

Re: Оператор "LIKE"

ktretyak написав:

Та думаю, що ТЗ геть розмите і автор теми досить слабо розуміє що саме йому потрібно.

Bartash написав:

1. Який рушій бази? У SQL Server є функція PATINDEX(), яка шукає по шаблону. Для інших рушіїв - гугліть.
2. LIKE вам тут не допоможе, якщо слова - не константні рядки.
3. Можна ще рахувати кількість пробілів (чи чим вони у вас розділяються, ті слова) у рядку.

Все я прекрасно розумію і досить чітко поставив завдання. Якби були якісь ще додаткові умови, я б їх обов'язково вказав. Конкретно завдання таке: створити запит на вибірку назв підручників, в назві видавництва якого рівно 3 слова. Все. Там невеличка учбова база з тими книжками. Навчання йде на базі MS SQL Server. Ніяких функцій ще не вивчали і в умові такого немає, тому я і запитав про шаблони LIKE.
До речі запропонований користувачем P.Y. варіант

... LIKE '% % %' AND NOT ... LIKE '% % % %'

дуже добре працює, за що я йому і дякую.
Вибачаюсь, що раніше не відповів, бо не мав можливості.

13

Re: Оператор "LIKE"

Так, Faltfromoss, перепрошую за попереднє повідомлення. Це я сам, дійсно, неуважно прочитав перше ваше повідомлення.

Варіант

... LIKE '% % %' AND NOT ... LIKE '% % % %'

здається це саме те, що необхідно. Особливо після уточнення вашого завдання, то по іншому без регулярок тут і не зробиш.

14

Re: Оператор "LIKE"

Faltfromoss написав:
ktretyak написав:

Та думаю, що ТЗ геть розмите і автор теми досить слабо розуміє що саме йому потрібно.

Bartash написав:

1. Який рушій бази? У SQL Server є функція PATINDEX(), яка шукає по шаблону. Для інших рушіїв - гугліть.
2. LIKE вам тут не допоможе, якщо слова - не константні рядки.
3. Можна ще рахувати кількість пробілів (чи чим вони у вас розділяються, ті слова) у рядку.

Все я прекрасно розумію і досить чітко поставив завдання. Якби були якісь ще додаткові умови, я б їх обов'язково вказав. Конкретно завдання таке: створити запит на вибірку назв підручників, в назві видавництва якого рівно 3 слова. Все. Там невеличка учбова база з тими книжками. Навчання йде на базі MS SQL Server. Ніяких функцій ще не вивчали і в умові такого немає, тому я і запитав про шаблони LIKE.
До речі запропонований користувачем P.Y. варіант

... LIKE '% % %' AND NOT ... LIKE '% % % %'

дуже добре працює, за що я йому і дякую.
Вибачаюсь, що раніше не відповів, бо не мав можливості.

"  " (2 пробіли)
"/ №6 ?" (що заманулося)
"Vasya    was    kidding!" (уявимо дві табуляції, що теж є білим символом і може розділяти слова)

Такі ситуації у базі обробляються чи заздалегідь передбачена їх фільтрація?