2012-07-22 32 views
0

我正在破解我的第一个ruby脚本来读写mysql的数据。从MySQL结果中分配一个BOOL

我想知道某个记录是否存在。我曾尝试:

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,而不是一个真或假的类,甚至是0/1。

我在这里错过了什么?准备好的声明甚至是正确的用途?

回答

0

为什么不使用计

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" 
+0

'EXISTS'得多优化。在你的COUNT(*)'解决方案中,你实际上需要**统计所有行**。而在'EXISTS'查询中,MySQL一旦找到一行就停止查找。 – 2012-07-22 16:06:35

+0

我看到这将如何明确地返回给我1或0,但希望看到一个更标准的方式来做到这一点(在性能影响@ShlomiNoach提到的顶部)。 – 2012-07-22 16:10:18

+0

这只是一个条件,你可以用任何表达来代替它。由于您使用的是WHERE子句,因此返回的行数很少,因此性能问题很小 – codingbiz 2012-07-22 16:39:18

1
sql = "SELECT IF(EXISTS(SELECT * FROM UserTrucks WHERE User = ? AND Truck = ?), 1, 0)"