SQL Сервер: Запуск CONTAINS для подстроки столбца - PullRequest
0 голосов
/ 20 марта 2020

У меня есть таблица table1 со столбцом nvarchar column1, которая выглядит примерно так:

phrase 1.1;phrase 1.2;phrase 1.3 ...
phrase 2.1;phrase 2.2;phrase 2.3 ...
...

Я хотел бы выполнить запрос CONTAINS только для первой фразы в столбце , Я пробовал несколько вариантов этого:

SELECT * FROM table1
WHERE CONTAINS(LEFT(table1.column1, CHARINDEX(';', table1.column1) - 1), <search query>)

Возможно ли это? В идеале я хотел бы сделать это без создания новой таблицы или столбца.

Редактировать - Некоторые из ошибок, которые я получаю: Incorrect syntax near the keyword 'LEFT'., An expression of non-boolean type specified in a context where a condition is expected., Incorrect syntax near ";". Expecting '(', or SELECT.

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Итак, здесь есть пара проблем. Вы можете использовать CONTAINS только для полнотекстового индексированного столбца. Если ваша таблица настроена таким образом, то замечательно!

Ваша вторая проблема заключается в том, что синтаксис CONTAINS немного неуклюж, и ему не нравится сложность. Вы можете обойти это, используя выражение общей таблицы, например:

DECLARE @table TABLE (column1 NVARCHAR(100));
INSERT INTO @table SELECT 'phrase 1.1;phrase 1.2;phrase 1.3;'
INSERT INTO @table SELECT 'phrase 2.1;phrase 2.2;phrase 2.3;'
SELECT LEFT(column1, CHARINDEX(';', column1) - 1) FROM @table;
WITH x AS (SELECT LEFT(column1, CHARINDEX(';', column1) - 1) AS search FROM @table)
SELECT * FROM x WHERE CONTAINS(x.search, 'phrase 1.2');

Заметив, что это не сработает, потому что @ table.column1 не полнотекстовый индексированный. Но он обходит синтаксическую ошибку и может быть адаптирован для вашего случая. Как то так:

WITH x AS (SELECT LEFT(column1, CHARINDEX(';', column1) - 1) AS search FROM table1)
SELECT * FROM x
WHERE CONTAINS(search, <search query>)
0 голосов
/ 20 марта 2020

Функция CONTAINS используется только тогда, когда таблица (столбец?) Настроена на использование полнотекстовой индексации. Я собираюсь догадаться, что это не тот случай, здесь. (Извините, если это так - у меня нет опыта полнотекстовой индексации.)

В любом случае, если вы сопоставляете первые символы в строке, более точная функция LEFT должна работать нормально:

SELECT *
 FROM table1
 WHERE LEFT(table1.column1, CHARINDEX(';', table1.column1) - 1) = @SearchQuery

Обратите внимание, что могут возникнуть проблемы, если в строке нет точек с запятой. Один из способов избежать этого - гарантировать, что всегда есть один подарок, например:

SELECT *
 FROM table1
 WHERE LEFT(table1.column1 + ';', CHARINDEX(';', table1.column1) - 1) = @SearchQuery
...