【问题标题】:SQL queries: Possible to search two columns at once with the same query parameter?SQL 查询:可以使用相同的查询参数一次搜索两列吗?
【发布时间】:2019-09-20 19:47:47
【问题描述】:

我有一个搜索功能,可以在数据库中搜索与 query_string 匹配的单词。目前,您可以按街道或地点、USRN 等搜索,例如,如果您同时输入街道和地点,它不会找到任何内容,因为街道和地点是同一张表的两个单独的列。但是,如果我输入其中任何一个,查询将返回相关建议的列表。我怎样才能做到这一点不会抵消另一个?

谢谢

这是我的查询:

SELECT USRN,
       RTRIM(SD)+', '+RTRIM(NT.TOWN_NAME) AS FEATURE_NAME,
       KEYWORDS = CAST(USRN AS VARCHAR(15))+' '+RTRIM(SD)+''+RTRIM(NL.LOCALITY_NAME)+' '+RTRIM(NT.TOWN_NAME)+''+RTRIM(NA.AUTHORITY_NAME)
FROM NS
     INNER JOIN NT ON NT.TOWN_UID = NS.TOWN_UID
     INNER JOIN NL ON NL.LOCALITY_UID = NS.LOCALITY_UID
     INNER JOIN NA ON NA.AUTHORITY_UID = NS.AUTHORITY_UID
WHERE CAST(USRN AS VARCHAR(15))+' '+RTRIM(SD)+' '+RTRIM(NL.LOCALITY_NAME)+' '+RTRIM(NT.TOWN_NAME)+''+RTRIM(NA.AUTHORITY_NAME) LIKE '%'+@SEARCH_STRING+'%';

编辑:经过一番思考,我认为可以通过将 query_string 拆分为单个单词,然后对每个拆分单词动态应用 LIKE 语句。

【问题讨论】:

  • 对不起,DBMS 是 Sql Server Management Studio
  • 除了您询问的那些之外,您的搜索字符串中的所有这些列(usrn、descriptor、town_name、authority_name)是否真的有值?
  • 是的,所有这些列中都有值。为了简单起见,我没有提到它们
  • 我没有问这些列中是否有值,我问的是值 from 这些列是否是搜索字符串的一部分。也就是说,搜索时是否必须包含 usrn、descriptior 等内容?
  • 是的,用户需要能够通过 USRN(代表每条街道的数字)、街道描述符(街道名称)、地区和城镇名称进行搜索。目前,用户只能键入其中一个,如果他键入它们的组合,则搜索结果不会返回任何内容。理想情况下,用户需要能够输入一个或多个。

标签: sql sql-server tsql select sql-like


【解决方案1】:

以下查询将对您有所帮助。将 STRING_SPLIT 与 CROSS APPLY 一起使用,您可以获得结果。

CREATE TABLE #TempTable(USRN Varchar(50), STREET_DESCRIPTOR varchar(50), LOCALITY_NAME VARCHAR(50), TOWN_NAME VARCHAR(50), AUTHORITY_NAME VARCHAR(50))

DECLARE @searchString varchar(max) = '456 eiusmod dolore'

INSERT INTO #TempTable VALUES('Lorem', '123 ipsum', 'dolor', 'sit', 'amet'),
('consectetur', '123 do', 'ut', 'magna', 'ad'),
('adipiscing', '456 eiusmod', 'labore', 'aliqua', 'minim'),
('elit', '789 tempor', 'et', 'Ut', 'veniam'),
('sed', '234 incididunt', 'dolore', 'enim', 'quis')

SELECT DISTINCT USRN,STREET_DESCRIPTOR,LOCALITY_NAME, TOWN_NAME,AUTHORITY_NAME
FROM #TempTable T
CROSS APPLY(
SELECT value FROM STRING_SPLIT(@searchString, ' ')
) R
WHERE T.USRN LIKE '%'+R.value+'%' OR  
      T.STREET_DESCRIPTOR LIKE '%'+R.value+'%' OR  
      T.LOCALITY_NAME LIKE '%'+R.value+'%' OR  
      T.TOWN_NAME LIKE '%'+R.value+'%' OR  
      T.AUTHORITY_NAME LIKE '%'+R.value+'%'

DROP TABLE #TempTable

【讨论】:

  • 谢谢,STRING_SPLIT 对我不起作用,但我设法找到了与此类似的解决方法
猜你喜欢
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多