[英]SQL Query union two tables, search multiple columns by multiple keywords
我在創建可以按關鍵字搜索結果的查詢或存儲過程時遇到困難。
我的 SQL 小提琴在這里:
http://sqlfiddle.com/#!18/48eaa8/1/0
我需要能夠允許我的用戶按關鍵字搜索。
例如,在上面的小提琴中,用戶應該能夠輸入“sony colour”或“sony 87154316459”來跨多個列查找結果。
我將如何 go 在存儲過程中執行此操作? 為了簡潔起見,我編輯了我的代碼,所以它比這復雜得多。 不幸的是,它不能從 Linq 轉換為 SQL。
您是否考慮過將您的查詢放入一個列表中,這樣您就可以不使用“like”了,而是執行以下操作:
SELECT * FROM Product WHERE ManufacturerName In ('Sony','Monitor') OR ProductName in ('Sony','Monitor')
根據您的問題更新,原始概念成立並且存儲的過程如下所示:
Create Table Product (
ProductId int,
ManufacturerId varchar(50),
ProductName varchar(50),
Upc varchar(50)
);
Create Table ProductVariation (
ProductVariationId int,
ProductId int,
VariationName varchar(50),
Upc varchar(50)
);
Create Table Manufacturer (
ManufacturerId int,
ManufacturerName varchar(50)
);
GO
Create OR ALTER Procedure p_SearchProduct(@searchList varchar(max))
AS
BEGIN
DECLARE @searchValue varchar(max);
set @searchValue = '%' + Replace(@searchList,' ','%') + '%';
BEGIN
with SearchList
as
(
SELECT value as SearchItem
FROM STRING_SPLIT(@searchList, ' ')
WHERE LTRIM(RTRIM(value)) <> ''
), SearchData as
(
SELECT
p.ProductId,
NULL AS 'ProductVariationid',
m.ManufacturerName,
ProductName,
UPC
FROM Product p
INNER JOIN Manufacturer m ON m.ManufacturerId = p.ManufacturerId
UNION
SELECT
v.ProductId,
v.ProductVariationId,
m.ManufacturerName,
p.ProductName + ' (' + v.VariationName + ')' AS 'ProductName',
v.UPC
FROM ProductVariation v
INNER JOIN Product p ON p.ProductId = v.ProductId
INNER JOIN Manufacturer m ON m.ManufacturerId = p.ManufacturerId
)
SELECT * FROM SearchData p
where p.ProductName like @searchValue
OR exists ( select 'x' from SearchList where p.UPC like '%' + SearchItem + '%')
END
END
GO
insert into Manufacturer Values(1,'Sony');
insert into Product Values(1,1,'Sony Monitor (Variable)','');
insert into Product Values(2,1,'Sony Walkman','32164578121');
insert into ProductVariation Values(1,1,'32" Colour','87154316458');
insert into ProductVariation Values(1,1,'48" Colour','87154316459');
exec p_SearchProduct 'Sony 87154316458';
你會用它來稱呼它
exec p_SearchProduct 'sony colour';
OR
exec p_SearchProduct 'sony 87154316458';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.