【问题标题】:ASP.NET Single Text Box Multiple Keyword SearchASP.NET 单文本框多关键字搜索
【发布时间】:2018-05-03 02:43:02
【问题描述】:

现在,我有:

Upper(tb.name) LIKE Upper('%' + :SearchBox + '%')

有了这个,我可以输入一个关键字,如果它存在于 tb.name 中,它将在结果中返回。我希望能够在 SearchBox 中输入多个关键字,以空格分隔,并返回包含所有关键字的结果。

示例:我在 SearchBox 中输入“Ford”并返回

Name
2015 Ford SUV Blue
2016 Ford SUV Black
2017 Ford SUV Blue

我希望能够输入“Ford Blue”(或任何其他数量的关键字)以返回

Name
2015 Ford SUV Blue
2017 Ford SUV Blue

任何关键字输入都将用空格分隔。所以,如果我输入“SUV Blue 2017”,它将是“SUV”和“Blue”和“2017”。 非常感谢任何帮助!

【问题讨论】:

标签: c# sql asp.net oracle


【解决方案1】:

您需要拆分关键字字符串并找到所有关键字都存在的行。像这样的东西(见代码中的 cmets)。

declare @keywords varchar(max)='ford blue'

--build a series of CTE
;with split as ( --split keyword string into table
select '%'+value+'%' v from string_split(@keywords,' ')
),
cnt as ( -- always single value
select count(*) cnt from split
),
prod as(
select p.* ,
COUNT(t.v) over(partition by p.name) cnt,
ROW_NUMBER() over(partition by p.name order by p.name) rn
from tb p
--where ProductName like all -- illegal and never work
inner join split t on p.ProductName like t.v
)
select * from prod
cross join cnt -- don't afraid of Cartesian product here
where prod.cnt = cnt.cnt -- all keywords found
and rn=1 -- no duplicates

【讨论】:

    【解决方案2】:

    将 % 放入空白字符串,例如:

    WITH TB AS(
         SELECT 'Ford SUV Blue' NAMES FROM DUAL UNION ALL
         SELECT 'Ford SUV GREEN' NAMES FROM DUAL UNION ALL
         SELECT 'SOME thing there' FROM DUAL 
    )
    SELECT * FROM TB H
    WHERE Upper(H.NAMES) LIKE Upper('%SOME% %thing%');
    

    【讨论】:

      猜你喜欢
      • 2011-09-14
      • 2012-10-06
      • 1970-01-01
      • 2015-01-16
      • 2015-09-05
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多