如下代码:
/// <summary>
/// 获取需求集群分组集合
/// </summary>
/// <param name="cityCode"></param>
/// <param name="indutrySubCode"></param>
/// <returns></returns>
public async Task<List<DemandClusterQto>> GetDemandClustersAsync(int? cityCode, Guid? indutrySubCode)
{
string sqlStr = @"select sp.Id,sp.title,CONCAT(DATE(MIN(sp.expected_delivery_time)),'至',DATE(MAX(sp.expected_delivery_time))) dateStr,
sp.DemandType,sp.IndustryGroup,sp.IndustrySubGroup,sp.IndustrySubGroupName,sp.IndustrySpecific,sp.IndustrySpecificName,
COUNT(bc.Id) CompanyNum,GROUP_CONCAT(bc.CompanyName) as companyNames,bc.City
from supd_demand_info sp
INNER JOIN base_companyinfo bc on sp.CreatorId=bc.UserId
Where sp.IsDeleted=0 and sp.status='Published' and sp.expected_delivery_time > NOW()";
var sqlPredicate = new List<string>();
var queryParams = new DynamicParameters();
if (indutrySubCode.HasValue)
{
sqlPredicate.Add(" sp.IndustrySubGroup=@indutrySubCode ");
queryParams.Add(nameof(indutrySubCode), indutrySubCode);
}
if (cityCode.HasValue)
{
sqlPredicate.Add("bc.City = @cityCode");
queryParams.Add(nameof(cityCode), cityCode);
}
if (sqlPredicate.Any())
{
var sqlPredicatesStr = sqlPredicate.Aggregate((p, n) => $"{p} and {n}");
sqlStr = @$"{sqlStr}
and {sqlPredicatesStr}";
}
sqlStr += " GROUP BY sp.DemandType,sp.title ";
sqlStr += " ORDER BY sp.expected_delivery_time desc";
var connection = await GetDbConnectionAsync();
var dbTransaction = await GetDbTransactionAsync();
return (await connection.QueryAsync<DemandClusterQto>(sqlStr, queryParams, dbTransaction)).ToList();
}
例子 1: 连接两个字符串常量
sqlSELECT CONCAT('Hello', ' ', 'World');
这将返回字符串 'Hello World'
。
例子 2: 连接列的值
假设你有一个名为 users
的表,其中包含 first_name
和 last_name
两个列,你想要查询完整的姓名:
sqlSELECT first_name, last_name, CONCAT(first_name, ' ', last_name) AS full_name
FROM users;
这将返回每一行的 first_name
、last_name
和连接它们中间加上一个空格的 full_name
。
例子 3: 连接多个列和字符串常量
你还可以将多个列和字符串常量连接在一起:
sqlSELECT CONCAT('User ID: ', id, ', Name: ', full_name) AS user_info
FROM (
SELECT id, CONCAT(first_name, ' ', last_name) AS full_name
FROM users
) AS subquery;
这将返回一个包含用户ID和完整姓名的信息字符串。
例子 4: 使用 CONCAT_WS
(带分隔符的连接)
如果你想要用特定的分隔符连接字符串,可以使用 CONCAT_WS
函数(WS 代表 "With Separator"):
sqlSELECT CONCAT_WS(', ', first_name, last_name) AS full_name
FROM users;
这将使用逗号和空格作为分隔符连接 first_name
和 last_name
。
在使用 CONCAT
或 CONCAT_WS
函数时,如果任何参数是 NULL
,则结果也将是 NULL
。如果你想要在 NULL
值的情况下返回空字符串或其他默认值,你可以使用 COALESCE
函数或 IFNULL
函数。例如:
sqlSELECT CONCAT(COALESCE(first_name, ''), ' ', COALESCE(last_name, '')) AS full_name
FROM users;
在这个例子中,如果 first_name
或 last_name
是 NULL
,COALESCE
函数将返回空字符串,从而确保 CONCAT
函数不会返回 NULL
。