Сравните две ПОДСТРОКИ в SQL Server

У меня есть следующий тестовый код:

DECLARE
     @Str1 VARCHAR(MAX) = 'Hello World'
    ,@Str2 VARCHAR(MAX) = 'World Hello'

SELECT CHARINDEX(@Str1, @Str2)

Оператор select возвращает ноль, потому что он берет весь @Str1 и пытается найти его в пределах @Str2.

Как я могу заставить поиск сравнивать подстроки?

Другими словами, я хочу, чтобы при поиске можно было найти подстроку @Str1 как подстроку в @Str2.


person Ahmed Ali    schedule 02.02.2018    source источник
comment
Любая подстрока? Как в "w" или "он" или ""?   -  person Onkel Toob    schedule 02.02.2018
comment
Хороший вопрос, я бы сказал словами   -  person Ahmed Ali    schedule 02.02.2018


Ответы (3)


Если вы просто разбиваете на пробелы, вы должны разделить строку, а затем найти каждое разделенное слово и получить его индекс char.

Вот краткий пример:

DECLARE
     @Str1 VARCHAR(MAX) = 'Hello World'
    ,@Str2 VARCHAR(MAX) = 'World Hello'


   DECLARE @substring VARCHAR(MAX)
   DECLARE c CURSOR FOR 
   SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@Str1, ' ', '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
    OPEN c
    FETCH NEXT FROM c INTO @substring
    WHILE @@FETCH_STATUS = 0 
    BEGIN
        SELECT CHARINDEX(@substring, @str2)
    FETCH NEXT FROM c INTO @substring
    END
    CLOSE c
    DEALLOCATE c
person Avitus    schedule 02.02.2018

Вы можете использовать instr (который вычисляет длину, используя символы, определенные входным набором символов), чтобы найти, существует ли подстрока в other.

select * from tablename
where instr(upper(str1),upper(str2)) > 0
--This would give if a str1 exist in the str2
or upper(str1) = upper(str2);--This would be same string
person praveen muppala    schedule 02.02.2018
comment
SQL Server с тегом OP... instr() - person John Cappelletti; 02.02.2018

У меня нет ответа, но я не могу комментировать :-(

Вопрос: Какой тип подстроки вы бы искали. Подстрокой может быть все слово «Hello», а также только буквы «llo» или даже «l». Я предполагаю, что вы хотите увидеть, содержатся ли какие-либо слова в @Str1 в @Str2.

Затем вы должны использовать функцию разделения, такую ​​​​как найденная «>здесь, чтобы сначала разделить @Str1 на список, а затем создать цикл по этой таблице, чтобы использовать CHARINDEX для поиска любой подстроки.

Но все это зависит от вашего определения "подстроки"

person Johan Bennink    schedule 02.02.2018
comment
Спасибо, я бы сказал слова, потому что, если я открою дверь для любой подстроки, я думаю, это сделает ее сложной напрасно. - person Ahmed Ali; 02.02.2018