在SQL语句

时间:2015-07-09 03:21:27

标签: c# sql sql-server dapper

我有一个相当古怪的问题。在SELECT语句中,我可以设置默认值吗?

在以下查询中,我希望boolItem始终为false(不从数据库中检索)。疯了我知道但是当我解释原因时请忍受。

SELECT id, boolItem = False
FROM MyTable;

我正在使用大型现有SQL数据库和项目。我正在查询数据并将它们作为Action C#对象返回。操作可以由用户或标准操作定制。这由属性IsCustom表示。

public class Action
{
    public int Id { get; set; }
    public bool IsCustom { get; set; }
    .....
}

在SQL数据库中,自定义操作存储在表custom_actions中,标准操作位于表actions中。

我使用以下代码检索并存储Action个对象。我想查询actions表总是将属性IsCustom设置为false。并且custom_actions表的查询始终将属性IsCustom设置为true。我使用的查询SELECT a.id AS Id, a.is_custom = false AS IsCustom不是有效的代码,因为该表没有is_custom列,但它用于演示我要做的事情。

public async Task<IEnumerable<Models.Action>> ExecuteAsync (IDbConnection conn, IDbTransaction transition, long userId)
{
    string sql = @"SELECT a.id AS Id, a.is_custom = false AS IsCustom
                   FROM actions a
                   INNER JOIN members_actions ma ON  a.id = ma.action_id AND is_custom = false
                   WHERE ma.member_id = :userId
                   UNION
                   SELECT a.id AS Id, a.is_custom = true AS IsCustom 
                   FROM custom_actions a
                   INNER JOIN members_actions ma ON  a.id = ma.action_id AND is_custom = true
                   WHERE ma.member_id = :userId;";

    return await conn.QueryAsync<Models.Action> (sql, new {userId = userId}, transition);
}

表&#39>行动&#39;列= id || description || name
表&#39; Custom_actions&#39;列= id || description || name || parameters

这可能吗?它比结构上更改数据库更好(将2个表合并为1并添加is_custom列)。

1 个答案:

答案 0 :(得分:2)

您只需选择值truefalse并使用别名指定列名称IsCustom

例如,我修改了您的示例,以显示如何执行此操作(并且还从JOIN条件中删除了AND is_custom = false/true,因为它没有显示任何一个is_custom列表)。

public async Task<IEnumerable<Models.Action>> ExecuteAsync (IDbConnection conn, IDbTransaction transition, long userId)
{
    string sql = @"SELECT a.id AS Id, false AS IsCustom
                   FROM actions a
                   INNER JOIN members_actions ma ON  a.id = ma.action_id 
                   WHERE ma.member_id = :userId
                   UNION
                   SELECT a.id AS Id, true AS IsCustom 
                   FROM custom_actions a
                   INNER JOIN members_actions ma ON  a.id = ma.action_id 
                   WHERE ma.member_id = :userId;";

    return await conn.QueryAsync<Models.Action> (sql, new {userId = userId}, transition);
}