如何在 SQL 参数中添加多个 "WHERE conditionA OR conditionB OR conditionC"?
How do I add multiple "WHERE conditionA OR conditionB OR conditionC" in SQL parameter?
我正在做分页。我现在拥有的是:
public void GetAllDevices(int siteId, List<int> deviceTypes, int rowsOffset, int pageSize)
{
var param = new
{
SiteId = siteId,
RowsOffset = rowsOffset,
PageSize = pageSize
};
string sqlQuery = @"SELECT * FROM device WHERE site_id = @SiteId
ORDER BY site_id
OFFSET @RowsOffset ROWS
FETCH NEXT @PageSize ROWS ONLY";
var response = await conn.QueryAsync<Model.Device>(sqlQuery, param);
}
所有非常标准的东西。现在,用户还可以对设备类型进行多次过滤,所以如果我要写原始 SQL,它看起来像这样:
SELECT * FROM device WHERE site_id = @SiteId
WHERE device_type_id = 1 OR device_type_id = 2 OR device_type_id = 3
ORDER BY site_id
OFFSET @RowsOffset ROWS
FETCH NEXT @PageSize ROWS ONLY
我的问题是如何编写 WHERE 子句的参数?我要在这里添加什么:
var param = new
{
SiteId = siteId,
RowsOffset = rowsOffset,
PageSize = pageSize
};
我在 .NET5 上使用 Dapper 和 PostgreSQL13,运行。
附加信息:
请参阅已接受的答案以了解如何执行此操作。请注意,它适用于 SQL 服务器,但不适用于 PostgreSQL。 PostgreSQL 不支持“IN”,因此您必须改为执行“ANY”。参考:
你只是使用了更多的参数:
SELECT *
FROM device WHERE site_id = @SiteId
AND (device_type_id = @DeviceTypeID1
OR device_type_id = @DeviceTypeID2
OR device_type_id = @DeviceTypeID3)
ORDER BY site_id
OFFSET @RowsOffset ROWS
FETCH NEXT @PageSize ROWS ONLY
var param = new
{
SiteId = siteId,
RowsOffset = rowsOffset,
PageSize = pageSize,
DeviceTypeID1 = deviceTypeID1,
DeviceTypeID2 = deviceTypeID2,
DeviceTypeID3 = deviceTypeID3
};
这是假设您用于设备类型的用户输入的变量名称。许多人需要根据您收集用户输入的方式以不同方式解构它。您可能需要根据您的数据结构动态构建 SQL 字符串。
(旁注:you should avoid using SELECT *
而是明确说明您在结果中需要的列)
由于您要为设备类型传递 List<int>
,因此您可以使用 IN
重写您的查询,只需将列表传递到一个参数中。 Dapper 允许您传递 IEnumerable
并将为您完成构建变量列表的工作:
SELECT *
FROM device WHERE site_id = @SiteId
AND device_type_id IN @DeviceTypeIDs
ORDER BY site_id
OFFSET @RowsOffset ROWS
FETCH NEXT @PageSize ROWS ONLY
var param = new
{
SiteId = siteId,
RowsOffset = rowsOffset,
PageSize = pageSize,
DeviceTypeIDs = deviceTypes
};
我正在做分页。我现在拥有的是:
public void GetAllDevices(int siteId, List<int> deviceTypes, int rowsOffset, int pageSize)
{
var param = new
{
SiteId = siteId,
RowsOffset = rowsOffset,
PageSize = pageSize
};
string sqlQuery = @"SELECT * FROM device WHERE site_id = @SiteId
ORDER BY site_id
OFFSET @RowsOffset ROWS
FETCH NEXT @PageSize ROWS ONLY";
var response = await conn.QueryAsync<Model.Device>(sqlQuery, param);
}
所有非常标准的东西。现在,用户还可以对设备类型进行多次过滤,所以如果我要写原始 SQL,它看起来像这样:
SELECT * FROM device WHERE site_id = @SiteId
WHERE device_type_id = 1 OR device_type_id = 2 OR device_type_id = 3
ORDER BY site_id
OFFSET @RowsOffset ROWS
FETCH NEXT @PageSize ROWS ONLY
我的问题是如何编写 WHERE 子句的参数?我要在这里添加什么:
var param = new
{
SiteId = siteId,
RowsOffset = rowsOffset,
PageSize = pageSize
};
我在 .NET5 上使用 Dapper 和 PostgreSQL13,运行。
附加信息:
请参阅已接受的答案以了解如何执行此操作。请注意,它适用于 SQL 服务器,但不适用于 PostgreSQL。 PostgreSQL 不支持“IN”,因此您必须改为执行“ANY”。参考:
你只是使用了更多的参数:
SELECT *
FROM device WHERE site_id = @SiteId
AND (device_type_id = @DeviceTypeID1
OR device_type_id = @DeviceTypeID2
OR device_type_id = @DeviceTypeID3)
ORDER BY site_id
OFFSET @RowsOffset ROWS
FETCH NEXT @PageSize ROWS ONLY
var param = new
{
SiteId = siteId,
RowsOffset = rowsOffset,
PageSize = pageSize,
DeviceTypeID1 = deviceTypeID1,
DeviceTypeID2 = deviceTypeID2,
DeviceTypeID3 = deviceTypeID3
};
这是假设您用于设备类型的用户输入的变量名称。许多人需要根据您收集用户输入的方式以不同方式解构它。您可能需要根据您的数据结构动态构建 SQL 字符串。
(旁注:you should avoid using SELECT *
而是明确说明您在结果中需要的列)
由于您要为设备类型传递 List<int>
,因此您可以使用 IN
重写您的查询,只需将列表传递到一个参数中。 Dapper 允许您传递 IEnumerable
并将为您完成构建变量列表的工作:
SELECT *
FROM device WHERE site_id = @SiteId
AND device_type_id IN @DeviceTypeIDs
ORDER BY site_id
OFFSET @RowsOffset ROWS
FETCH NEXT @PageSize ROWS ONLY
var param = new
{
SiteId = siteId,
RowsOffset = rowsOffset,
PageSize = pageSize,
DeviceTypeIDs = deviceTypes
};