首页 > 解决方案 > SQL 查询:可以使用相同的查询参数一次搜索两列吗?

问题描述

我有一个搜索功能,可以在数据库中搜索与 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动态地将 Statement 应用于每个拆分单词。

标签: sqlsql-servertsqlselectsql-like

解决方案


以下查询将为您提供帮助。将 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

推荐阅读