2016-07-20 5 views
-3

Как бы вам удалось выполнить поиск, если фраза содержит точные слова в MySQL?SQL - поиск по фразе без пробелов

f.e. если есть столбец phrase с фразой: «Здравствуйте, меня зовут Джек» , и я хотел бы найти, если он содержит слова: «имя» и «Jack» - это тихий просто:

SELECT `phrase` FROM column WHERE `phrase` RLIKE '[[:<:]]name[[:>:]]' 
AND `phrase` RLIKE '[[:<:]]Jack[[:>:]]' 

Но как бы вам удалось это сделать, если бы фраза была такой: 'HelloMyNameIsJack' ?? (без пробелов)

EDIT: Я не могу использовать дело «как» если бы другая фраза: «HelloMyXyznamexyzIsJack» - было бы найти мне целую фразу - что я не хочу - я просто хочу, чтобы найти слова

EDIT 2: трудно объяснить, но позвольте мне попробовать так: я хочу найти фразу, которая содержит заданные слова, НО как слова - если я даю слова «имя» и «Джек» - я НЕ ДОЛЖЕН Fe «HelloMyNamesIsJacky» - проблема в том, как позволить sql знать, какие из «HelloMyNamesIsJacky» являются словами (поскольку между ними нет пробелов)

Любые идеи?

+2

Вы можете использовать 'like'. Нет необходимости в регулярном выражении здесь –

+0

@up: как? Помните, что я спрашиваю о примере без пробелов – user6615224

+0

Вы хотите, чтобы слова были в порядке? Как в, как насчет «Джек - мое имя»? –

ответ

0

Что делать, если вы все еще используете LIKE оператор

SELECT `phrase` 
FROM `column` 
WHERE `phrase` LIKE '%name%' 
AND `phrase` LIKE '%Jack' 

Похоже, вы скорее должны идти на Full-Text Search в этом случае

+0

нет, причина, если будет фраза f.e. «HelloMyXyznamexx» - он найдет целое слово - которое я не хочу – user6615224

+0

@ user6615224, нет, это не связано с условием 'и'. Я пытаюсь сопоставить «имя» и «Джек» в одной строке. – Rahul

+0

U dont understand - read edit – user6615224

1

Учитывая внесенные изменения, это звучит, как это будет работать, используя concat с like:

select phrase 
from yourtable 
where concat(' ',phrase,' ') like '% name %' and 
     concat(' ',phrase,' ') like '% Jack %' 

Примечание. Это может закончиться неудачей, если ваше предложение заканчивается на определенный период. Вам понадобится код для такого случая ...

+0

nope, not working – user6615224

+2

@ user6615224 - вам нужно сделать лучшую работу, определяющую ваши требования и объяснив, почему это не работает, а просто говорит, что это не работает. Очевидно, что многие из нас смущены ... этот ответ будет соответствовать «Привет, мое имя - jack», но не соответствует «Hellomynameisjack» ... – sgeddes

+0

Да, я пытаюсь - посмотрите Edit и Edit2 в главном сообщении – user6615224

1

Чтобы найти слова, подобные вашим примерам, вы можете попробовать добавить буквы в верхнем регистре с пробелами, а затем запустить существующее регулярное выражение. Это не то же самое, что разбор английских слов из ваших данных, однако, это чревато техническими проблемами. Тем не менее, это может быть быстрым взломом.

Исходя из ваших примеров, я сделал несколько писем здесь, чтобы дать вам идею (но вы хотели бы добавить A, B, C ...):

select Phrase 
from MyTable 
where replace(replace(replace(Phrase, 'I', ' I'), 'J', ' J'), 'N', ' N') rlike '[[:<:]]name[[:>:]]' 
    and replace(replace(replace(Phrase, 'I', ' I'), 'J', ' J'), 'N', ' N') rlike '[[:<:]]Jack[[:>:]]' 

Приведенные данные, как:

'Hello my name is Jack' 
'HelloMyNameIsJack' 
'HelloMyXyznamexyzIsJack' 
'HelloMyNamesIsJacky' 
'HelloMyNameIsJacky' 
'HelloJackIsMyName' 

Ваши результаты будут:

'Hello my name is Jack' 
'HelloMyNameIsJack' 
'HelloJackIsMyName' 
+0

wow - это отличный способ! Но пробем заключается в том, что данные хранятся в тысячах или даже больше записей .... – user6615224

+0

@ user6615224 Я не уверен, что понимаю. Вы говорите, что производительность неприемлема? –

+0

К сожалению, тысячи записей, поэтому я не думаю, что это сработает. И - почему даже этот пример не работает в моей базе данных MySql? Это бросает меня в аранжировщик – user6615224

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