【问题标题】:Assigning a BOOL from a MySQL result从 MySQL 结果分配 BOOL
【发布时间】:2012-07-22 15:52:22
【问题描述】:

我正在编写我的第一个 ruby​​ 脚本来读写 mysql。

我想知道某条记录是否存在。我试过了:

sql = "SELECT EXISTS(SELECT * FROM UserTrucks WHERE User = ? AND Truck = ?)"
pst = con.prepare(sql)
does_exist = pst.execute(user_id, truck_id)

但是当我打印 should_alert 的类时,它是 MySQL::STMT 而不是 True 或 False 类,甚至是 0/1。

我在这里缺少什么?准备好的语句甚至是正确的用途吗?

【问题讨论】:

    标签: mysql ruby boolean prepared-statement exists


    【解决方案1】:
    sql = "SELECT IF( EXISTS(SELECT * FROM UserTrucks WHERE User = ? AND Truck = ?), 1, 0)"
    

    【讨论】:

      【解决方案2】:

      为什么不使用计数

      sql = "SELECT CASE WHEN COUNT(1) > 0 THEN 1 ELSE 0 END AS Exist FROM UserTrucks WHERE User = ? AND Truck = ?"
      

      sql = "SELECT CASE WHEN EXISTS(SELECT * FROM UserTrucks WHERE User = ? AND Truck = ?) THEN 1 ELSE 0 END AS Exist" 
      

      【讨论】:

      • EXISTS 更加优化。在您的COUNT(*) 解决方案中,您实际上需要计算所有行数。而在 EXISTS 查询中,MySQL 会在找到单行后停止查找。
      • 我知道这将如何显式返回 1 或 0,但希望看到更标准的方法来执行此操作(除了 @ShlomiNoach 提到的性能影响之外)。
      • 这只是一个条件,你可以用任何表达式替换它。由于您使用的是 WHERE 子句,因此返回的行数很少,因此性能问题很小
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多