Несколько операторов LIKE в TSQL
Это то, чего я пытаюсь достичь в простейшей форме:
SELECT p.ProductId, p.ProductName, p.SKU FROM tbl_Product p WHERE (p.ProductName LIKE '%white%' OR p.SKU LIKE '%white%') AND (p.ProductName LIKE '%cup%' OR p.SKU LIKE '%cup%')
Я пытаюсь сделать это в UDF, который принимает параметр, разделенный запятыми, для всех условий поиска.
Я попытался разбить этот параметр во временную таблицу и попробовать присоединиться, например:
- Как писать подобные заявления в Entity Framework, когда любимая оценка содержит%
- Полнотекстовый поиск vs LIKE
- Как использовать wild card в середине SQL-сервера, например запроса
- Запрос, чтобы найти столбцы, которые заканчиваются символом процента%
- Как с правильным значением с подстановочным процентом
DECLARE @SearchText nvarchar(1000) SELECT @SearchText='white,cup' DECLARE @SearchTerms TABLE (String nvarchar(200)) INSERT INTO @SearchTerms (String) SELECT '%' + String + '%' FROM dbo.CsvSplitString(@SearchText) SELECT p.ProductId, p.ProductName, p.SKU FROM tbl_Product p JOIN @SearchTerms s ON (p.ProductName LIKE s.String OR p.SKU LIKE s.String)
Но это не возвращает то, что я хочу – оно возвращает любые записи, в которых имя или SKU соответствует одному из условий поиска. Мне нужно, чтобы он возвращался как первый запрос, где Имя или SKU соответствует всем поисковым запросам (я думаю, это имеет смысл).
Было бы большой благодарностью за толкание в правильном направлении – дайте мне знать, если вы хотите, чтобы я был более конкретным.
Примечание: полнотекстовый поиск в настоящий момент не является жизнеспособным вариантом.
Благодаря!
- Как найти строку с одной строкой цитаты из таблицы?
- Шаблон IP-адреса в SQL-команде
- Запрос возвращает разные результаты
- SQL Server datetime LIKE выберите?
- Такое же LIKE условие применяется ко многим столбцам
- Добавление оператора LIKE в предложение WHERE (динамический SQL)
- Почему существует аргумент ESCAPE оператора LIKE?
- как выбрать запись, чей соответствующий процент выше, чем другой, используя такой же оператор в sql-сервере?
Следующий запрос должен сделать это, но это может быть не самый быстрый!
DECLARE @SearchText nvarchar(1000) SELECT @SearchText='white,cup' DECLARE @keywords TABLE (keyword nvarchar(255)) DECLARE @keywordCount int INSERT INTO @keywords (keyword) SELECT * FROM dbo.CsvSplitString(@SearchText) SET @keywordCount = (SELECT COUNT(*) FROM @keywords) SELECT * FROM tbl_Product p WHERE EXISTS (SELECT * FROM (SELECT productId FROM tbl_Product, @keywords WHERE productname like '%' + keyword + '%' or sku like '%' + keyword + '%' GROUP BY productid HAVING COUNT(*) = @keywordCount ) matches WHERE p.ProductId=matches.ProductId )
Если все остальное не удается, вы можете запустить курсор над @SearchTerms
и @SearchTerms
результаты, проверяя каждый элемент, если он присутствует в ваших результатах.
У вас, скорее всего, не будет много элементов поиска (5-6 будет настолько редкими), поэтому стоимость курсора должна быть незначительной по сравнению с бегом, like
и снова над текстом. И это тоже не должно быть слишком дорого.
Изменить: то, что я делал в прошлом для поиска, отправляет запрос в текстовом виде на сервер вместо того, чтобы полагаться на хранимые процедуры, поэтому я мог бы самостоятельно объединить свои условия. Вы можете сделать то же самое с динамическими запросами и exec
на сервере, если хотите. Этот способ кажется довольно взломанным, и это не очевидно, это улучшение производительности. Пища для размышлений.