在SQL Server上对数组应用类似函数

时间:2019-03-07 14:12:34

标签: sql node.js sql-server tsql sql-like

我正在从前端获取数组以根据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 个答案:

答案 0 :(得分:1)

在SQL Server 2017中,您可以使用OPENJSON照原样使用JSON字符串:

g (f a) -> f (g a)

Demo on db<>fiddle

答案 1 :(得分:0)

例如,对于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%' 
     )

答案 2 :(得分:0)

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);