sql - 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 应用于每个拆分单词。
解决方案
以下查询将为您提供帮助。将 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
推荐阅读
- python - 将列表值应用于字典列表
- html - 以较小的宽度将行布局折叠到列,而不会丢失前一个元素的顶部边距
- python - 如何从文件对象中读取带有 pyarrow 的 csv.gz 文件?
- objective-c - macOS 上的动画 NSView 约束(图层支持视图)objective-c
- docker - 使用`docker run -- rm`时有没有办法找到容器的运行时间
- python - 居中多行图例标题
- c# - 使用 Ban Unknown Properties 针对模式验证 JSON
- r - 抓取在线地图
- android - Android Jetpack Navigations:从“非导航”片段导航
- c# - 如何从骰子脚本中获取骰子值到石头脚本