Применить как функцию на массиве SQL Server - PullRequest
1 голос
/ 07 марта 2019

Я получаю массив из внешнего интерфейса для выполнения фильтров в соответствии с запросом SQL.

Я хочу применить фильтр LIKE к массиву.Как добавить массив внутри LIKE функции?

Я использую Angular с Html в качестве внешнего интерфейса и Node в качестве внутреннего.

Массив, передаваемый из внешнего интерфейса:

 [ "Sports", "Life", "Relationship", ...]

SQL-запрос:

SELECT *
FROM Skills
WHERE Description LIKE ('%Sports%')

SELECT *
FROM Skills
WHERE Description LIKE ('%Life%')

SELECT *
FROM Skills
WHERE Description LIKE ('%Relationship%')

Но я получаю массив из внешнего интерфейса - как создать запрос для этого?

Ответы [ 3 ]

1 голос
/ 07 марта 2019

В SQL Server 2017 вы можете использовать OPENJSON, чтобы использовать строку JSON как есть:

SELECT *
FROM skills
WHERE EXISTS (
    SELECT 1
    FROM OPENJSON('["Sports", "Life", "Relationship"]', '$') AS j
    WHERE skills.description LIKE '%' + j.value + '%'
)

Демонстрация по дб <> скрипке

0 голосов
/ 07 марта 2019

Простой map() -звук в массиве words позволит вам сгенерировать соответствующие запросы, которые вы затем сможете выполнить (с объединением или без объединения их сначала в одну строку).

Демонстрация:

var words = ["Sports", "Life", "Relationship"];
var template = "Select * From Skills Where Description Like ('%{0}%')";

var queries = words.map(word => template.replace('{0}', word));
var combinedQuery = queries.join("\r\n");

console.log(queries);
console.log(combinedQuery);
0 голосов
/ 07 марта 2019

Например, для SQL Server 2016+ и STRING_SPLIT():

DECLARE @Str NVARCHAR(100) = N'mast;mode'

SELECT name FROM sys.databases sd
INNER JOIN STRING_SPLIT(@Str, N';') val ON sd.name LIKE N'%' + val.value + N'%'

-- returns:

name
------
master
model

Стоит отметить, что входные данные должны строго контролироваться, поскольку такой способ может привести к атаке SQL-инъекции

Как альтернативный, более безопасный и простой подход: SQL может генерироваться на стороне приложения следующим образом:

 Select * from Skills 
 WHERE (
     Description Like '%Sports%' 
 OR  Description Like '%Life%' 
 OR  Description Like '%Life%' 
     )
...