0

我将使用 SQL Server 对表中包含的每个单词进行搜索。查询必须在以下情况下工作:

  1. 查询必须像or运算符一样在colourstyle和字段marerial中搜索shape
  2. 查询必须搜索每个单独的搜索词(如bluered和)modern以及wood这些词之间的所有可能组合。
  3. 搜索值必须包含在类似于like运算符的列中。

这意味着对于这个词,我只能找到带有 [[colour like '%blue%'colour like '%red%'] material like '%wood%'style like '%modern%'和每个形状] 的产品。(必需的输出)换句话说,每个单词的所有组合。

到目前为止,这是我的查询:

select distinct colour, style, material, shape
from products
where colour in ('blue', 'red', 'modern', 'wood') or
      style in ('blue', 'red', 'modern', 'wood') or
      material in ('blue', 'red', 'modern', 'wood') or
      shape in ('blue', 'red', 'modern', 'wood') ;

这是结果:

颜色 风格 材料 形状
现代的 圆形的
现代的 金属 圆形的
阿尔巴斯特 现代的 丙烯酸纤维 圆形的
阿尔巴斯特 现代的 玻璃 圆筒
阿尔巴斯特 现代的 玻璃 其他
阿尔巴斯特 现代的 玻璃 长方形
阿尔巴斯特 现代的 玻璃 圆形的
阿尔巴斯特 现代的 玻璃 正方形
阿尔巴斯特 现代的 合成材料 地球
阿尔巴斯特 现代的 合成材料 圆形的
琥珀色 现代的 圆形的
黑色的 小屋 木头
黑色的 小屋 木头 圆形的
黑色的 现代的 反射器
黑色的 现代的 绝对值 圆形的
黑色的 现代的 丙烯酸纤维 圆形的
黑色的 现代的
黑色的 现代的 角形
黑色的 现代的 圆筒
黑色的 现代的 半圆
黑色的 现代的 其他
黑色的 现代的 椭圆形
黑色的 现代的 长方形
黑色的 现代的 圆形的
黑色的 现代的 正方形
黑色的 现代的 棉布 六边形
黑色的 现代的 棉布 圆形的
黑色的 现代的 玻璃 长方形

但我看到结果是基于一个或多个单词是否可以找到。

我也试过这个查询,但没有找到结果。

select distinct colour, style, material, shape
from products
where colour in ('blue', 'red', 'modern', 'wood') and
      style in ('blue', 'red', 'modern', 'wood') and
      material in ('blue', 'red', 'modern', 'wood') and
      shape in ('blue', 'red', 'modern', 'wood') ;

我无法找到一个词是颜色、形状、样式还是材料。

更新:预期结果

颜色 风格 材料 形状
蓝色的 现代风格 木头 圆形的
红色的 现代的 木头 长方形
红色的 现代的 木头 圆形的
蓝色的 现代的 木头 长方形
蓝色的 现代的 木头 地球
红色的 现代的 木头 地球
4

2 回答 2

1

我认为没有干净的解决方案。这个声明可以完成这项工作:

select distinct colour, style, material, shape
from products 
where colour + style + material + shape like '%blue%' or
      colour + style + material + shape like '%red%' or
      colour + style + material + shape like '%modern%' or
      colour + style + material + shape like '%wood%';
于 2018-05-28T13:57:58.510 回答
0

经过一段时间的搜索,我找到了这个解决方案:

  • 我创建了一个带有一个参数的存储过程:@query.
  • 然后我将查询拆分为空格。请参阅此问题的已接受答案:Splitting the string in sql server
  • 然后我做了我的选择声明。
  • 对于查询的每一部分,我都添加了 where 子句并替换{0}为我的查询部分。
  • 然后只需添加1 = 1即可获得有效的 SQL 查询。
  • EXEC使用语句执行我生成的 SQL 查询。
  • 最后执行我的存储过程。

这是我的代码:

declare @sql nvarchar(max);
declare @q nvarchar(max);
declare @whereClause nvarchar(max);
declare @currentrow int = 1;

declare @totalqueries int = (select count(pn) 
                             from dbo.SplitString(' ', @query)); -- count how many query 
                                                                 -- parts I've got.

set @sql = 'select distinct colour, style, material, shape
            from products 
            where '; -- my select statement

set @whereClause = 'colour + style + material + shape like ''%{0}%'' and '; -- where clause

while @currentrow <= @totalqueries begin;

    select @q = s 
    from dbo.SplitString(' ', @query)
    where pn = @currentrow;

    set @sql = @sql + REPLACE(@whereClause, '{0}', @q); -- replacing `{0}` with my 
                                                        -- query part `@q`

    set @currentrow = @currentrow + 1;

end;

set @sql = @sql + ' 1 = 1;';

exec (@sql);

另请参阅此功能:

create FUNCTION dbo.SplitString (@sep nvarchar(1), @s varchar(4000))
    RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
        SELECT 1, 1, CHARINDEX(@sep, @s)
        UNION ALL
        SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
        FROM Pieces
        WHERE stop > 0
    )
    SELECT pn,
        SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) AS s
    FROM Pieces
)
于 2018-06-01T06:13:04.870 回答