Tengo una pregunta bastante peculiar. En una instrucción SELECT
, ¿puedo establecer un valor predeterminado?
En la siguiente consulta, quiero que boolItem
sea siempre falso (no recuperado de la base de datos). Loco lo sé pero ten paciencia conmigo cuando explique por qué.
SELECT id, boolItem = False
FROM MyTable;
Estoy trabajando con una gran base de datos SQL y proyecto. Estoy consultando datos y devolviéndolos como objetos de Action
C #. Una acción puede ser personalizada por el usuario o una acción estándar. Esto está IsCustom
por una propiedad IsCustom
.
public class Action
{
public int Id { get; set; }
public bool IsCustom { get; set; }
.....
}
En la base de datos SQL, las acciones personalizadas se almacenan en la tabla custom_actions
y las acciones estándar están en las actions
la tabla.
Recupero y almaceno objetos de Action
usando el siguiente código. Quiero hacer que la consulta de la tabla de actions
siempre establezca la propiedad IsCustom
en false. Y la consulta de la tabla custom_actions
siempre establece la propiedad IsCustom
en verdadero. Estoy usando la consulta SELECT a.id AS Id, a.is_custom = false AS IsCustom
que no es un código válido porque la tabla no tiene una columna is_custom
pero es para demostrar lo que intento hacer.
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);
}
Table 'Actions' Columns = id || description || name
Tabla 'Columnas de Custom_actions' = id || description || name || parameters
es posible? Es mejor que cambiar estructuralmente la base de datos (fusionar las 2 tablas en 1 y agregar una columna is_custom
).
Puede simplemente seleccionar el valor true
o false
y usar un alias para especificar el nombre de columna IsCustom
Por ejemplo, modifiqué su ejemplo a continuación para mostrar cómo hacerlo (y también AND is_custom = false/true
de las condiciones de JOIN porque no parecía que hubiera una columna is_custom
en ninguna de las tablas).
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);
}