Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да намерите редове чрез филтриране на определен текст с помощта на търсене на пълен текст в MS SQL 2012

Не мисля, че пълнотекстово търсене ще ви помогне. Изглежда, че търсите всеки фрагмент, дори като технически термини като /1/ .

Опитайте това за XML

 DECLARE @SearchFor VARCHAR(100)='1';

 SELECT * 
 FROM SettingsData
 WHERE xmldata.exist(N'//*[contains(text()[1],sql:variable("@SearchFor"))]')=1;

Той ще провери вътрешния text() на всеки възел ако съдържа фразата за търсене. Но всяка стойност с 1 вътре е намерено (напр. всяко несвързано число, което има 1 някъде.) Може да търсите text()="1" и изпълнете contains само ако дължината на низа надвишава определен минимум.

Нещо като

WHERE xmldata.exist(N'//*[text()[1]=sql:variable("@SearchFor") or(string-length(text()[1])>=3 and contains(text()[1],concat("/",sql:variable("@SearchFor"),"/")))]')=1;

Досега Json не е нищо повече от низ и трябва да бъде анализиран. С v2016 Microsoft въведе JSON поддръжка, но вие сте на v2012. Проблемът с LIKE търсене на JSON-низ може да бъде, че ще намерите 1 дори като част от името на елемент. Останалото е както по-горе...

 SELECT *
 FROM SettingsData
 WHERE jsondata LIKE '%' + @SearchFor + '%';



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Значение на ПЪРВИЧЕН КЛЮЧ, УНИКАЛЕН КЛЮЧ и КЛЮЧ, когато се използват заедно при създаване на таблица

  2. SQL Server IN срещу EXISTS производителност

  3. Как мога да вляза и да намеря най-скъпите заявки?

  4. ExecuteReader:Свойството на връзката не е инициализирано

  5. Най-ефективният начин за ограничаване на връщанията на редове от заявка за обединение - TSQL