Запросы SQL: можно ли искать два столбца одновременно с одним и тем же параметром запроса? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть функция поиска, которая ищет в базе данных слова, соответствующие строке query_string. В настоящее время вы можете выполнять поиск по улице ИЛИ по местоположению, USRN и т. Д., Например, если вы набираете как улицу, так и населенный пункт, он ничего не находит, поскольку улица и населенный пункт являются двумя отдельными столбцами одной и той же таблицы. Однако, если я ввожу один из них, запрос возвращает список соответствующих предложений. Как я могу сделать так, чтобы одно не отменяло другое?

Спасибо

вот мой запрос:

SELECT USRN,
       RTRIM(STREET_DESCRIPTOR)+', '+RTRIM(NSG_TOWN.TOWN_NAME) AS FEATURE_NAME,
       KEYWORDS = CAST(USRN AS VARCHAR(15))+' '+RTRIM(STREET_DESCRIPTOR)+''+RTRIM(NSG_LOCALITY.LOCALITY_NAME)+' '+RTRIM(NSG_TOWN.TOWN_NAME)+''+RTRIM(NSG_AUTHORITY.AUTHORITY_NAME)
FROM NSG_STREET
     INNER JOIN NSG_TOWN ON NSG_TOWN.TOWN_UID = NSG_STREET.TOWN_UID
     INNER JOIN NSG_LOCALITY ON NSG_LOCALITY.LOCALITY_UID = NSG_STREET.LOCALITY_UID
     INNER JOIN NSG_AUTHORITY ON NSG_AUTHORITY.AUTHORITY_UID = NSG_STREET.AUTHORITY_UID
WHERE CAST(USRN AS VARCHAR(15))+' '+RTRIM(STREET_DESCRIPTOR)+' '+RTRIM(NSG_LOCALITY.LOCALITY_NAME)+' '+RTRIM(NSG_TOWN.TOWN_NAME)+''+RTRIM(NSG_AUTHORITY.AUTHORITY_NAME) LIKE '%'+@SEARCH_STRING+'%';

РЕДАКТИРОВАТЬ: После некоторых размышлений, я думаю, что это может быть возможно, разделив строку query_string на отдельные слова, а затем динамически применяя оператор LIKE к каждому из этих разделенных слов. Я понятия не имею, как это сделать, хотя

1 Ответ

1 голос
/ 03 мая 2019

Следующий запрос поможет вам.Используя 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
...