哪个sql查询更适合位类型?

时间:2016-04-22 15:19:52

标签: c# sql ado.net

我有一个方法来获取数据库中带锁标志的用户名计数

public bool UsernameExistInDatabase(string username)
{
    bool states = false;
    using (SqlConnection con = new SqlConnection(this._connectionString))
    {
        string query = "SELECT COUNT(username) FROM tbl_sample WHERE (lock = '1')";
        SqlCommand cmd = new SqlCommand(query, con);
        con.Open();
        int result = Convert.ToInt32(cmd.ExecuteScalar());
        con.Close();
        if (result > 0)
        {
            states = true;
        }
    }
    return states;
}

但我有三种不同的方式

SELECT COUNT(username) FROM tbl_sample WHERE (lock = '1')
SELECT COUNT(username) FROM tbl_sample WHERE (lock = 1)
SELECT COUNT(username) FROM tbl_sample WHERE (lock = 'true')

我应该为我的代码选择哪一个(即哪一个更好)

table structure running 3 query and same result

4 个答案:

答案 0 :(得分:1)

奇怪的是,由于有很多方法可以指示为true,但是大多数数据库引擎可靠地将Zero视为false,我通常认为true为非False,如下所示:

SELECT COUNT(username) FROM tbl_sample WHERE (lock <> 0)

显然,如果NULL是一个问题,并且您希望NULL读为false,则必须执行以下操作:

SELECT COUNT(username) FROM tbl_sample WHERE (lock IS NOT NULL AND lock <> 0)

答案 1 :(得分:1)

使用where lock = 1; '1'true都会发生不必要的转换。此外,'true'不正确。

  

整数数据类型,可以取值1,0或NULL。

<强>备注

  

字符串值TRUE和FALSE可以转换为位值:TRUE转换为1,FALSE转换为0.

Src:https://msdn.microsoft.com/en-IN/library/ms177603.aspx

答案 2 :(得分:0)

您应该始终向下一个必须处理您的代码的人明确表达您的意图。在这种情况下,您的列是一个不可为空的位列,其潜在值为0或1(忽略任何转换)。

SELECT COUNT(username) FROM tbl_sample WHERE lock = 1

这是你最好的方式 - 没有奇怪的内部转换,也没有混淆你的行为。

答案 3 :(得分:0)

我建议= 1,我无法拒绝重写你使用的方法......

public bool UsernameExistInDatabase(string username)
{
    using (SqlConnection con = new SqlConnection(this._connectionString))
    {
        string query = "SELECT COUNT(username) FROM tbl_sample WHERE (lock = 1)";
        con.Open();
        using (SqlCommand cmd = new SqlCommand(query, con))
        {
            int result = Convert.ToInt32(cmd.ExecuteScalar());
            if (result > 0)
            {
                // No worries about con.Close()! Using will handle it
                return true;
            }
        }
    }
    return false;
}

我不得不说方法名称本身让我感到困惑 - 我们清楚地查找用户是否存在于数据库中并且已被锁定?我们是否按照方法名称建议将用户存在于数据库中?