2008-11-06 4 views
4

(Примечание: это для SQL MySQL, а не для SQL Server.)SQL (MySQL): сопоставить первую букву любого слова в строке?

У меня есть столбец базы данных со значениями, такими как «abc def GHI JKL». Я хочу написать предложение WHERE, которое включает тест без учета регистра для любого слова, которое начинается с определенного письма. Например, этот пример будет проверять true для букв a, c, g, j, потому что с каждой из этих букв начинается «слово». Приложение предназначено для поиска, который предлагает найти записи, содержащие только слова, начинающиеся с указанной буквы. Также обратите внимание, что для этой таблицы нет полнотекстового индекса.

ответ

5

Использование REGEXP opearator:

SELECT * FROM `articles` WHERE `body` REGEXP '[[:<:]][acgj]' 

Он возвращает записи, где колонка тела содержит слова, начинающиеся с, C, G или I (чувствительно к регистру)

иметь в виду, хотя: это не очень хорошо идея, если вы ожидаете какой-либо большой нагрузки (не используя индекс - он сканирует каждый ряд!)

+0

Спасибо! Работает как шарм. Я добавил ИНДЕКС ПОЛЬЗОВАТЕЛЯ. Угадайте, что лучше сканировать весь индекс, чем сканировать всю таблицу. – 2008-11-06 16:52:23

7

Вы можете использовать операцию LIKE. Если ваши слова через пробел, добавить пробел в начале строки, чтобы дать первое слово шанс соответствовать:

SELECT 
    StringCol 
FROM 
    MyTable 
WHERE 
    ' ' + StringCol LIKE '% ' + MyLetterParam + '%' 

Где MyLetterParam может быть что-то вроде этого:

'[acgj]' 

Для ищите более чем пространство в качестве разделителя слов, вы можете расширить эту технику. Следующее будет рассматривать TAB, CR, LF, пространство и NBSP как разделители слов.

WHERE 
    ' ' + StringCol LIKE '%['+' '+CHAR(9)+CHAR(10)+CHAR(13)+CHAR(160)+'][acgj]%' 

Этот подход имеет приятное прикосновение к стандарту SQL. Он будет работать без изменений во всех основных диалектах SQL.

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