2010-08-02 153 views
0

使用C#.NET和MYSQL如何使用Case语句

我想要使用像SQL

case语句

查询

SELECT vehicleno, 
     brandname, 
     CASE 
     WHEN inexpire < 0 THEN 'Expired' 
     ELSE inexpire 
     END AS inexpire 
FROM (SELECT Concat(plateno, vehicleno) AS vehicleno, 
       brandname, 
       Datediff(inedate, Curdate()) AS inexpire 
     FROM tb_car 
     WHERE inedate < DATE_ADD(Curdate(), INTERVAL 30 DAY) 
     GROUP BY vehicleno) AS tab1 

当我运行查询它显示的输出

System.Byte[]代替 “过期”

在上述曲ERY inexpire是列的值

我该如何解决这个问题.....

需要查询帮助

+0

您似乎混合了不同的数据类型,以获得一个数值(您检查数值是否小于0)或字符串'Expired'。 – 2010-08-02 07:40:29

+0

什么是'unfpire'意味着返回?你是否希望它返回字符串'已过期',如果它已经过期,并且如果它没有被投射到字符串的天数?或者是其他东西? – 2010-08-02 07:41:37

回答

4

我认为你将需要使用相同的数据类型为两种情况

eg

case when inexpire < 0 then 'Expired' else 'inexpired' end as inexpire 

case when inexpire < 0 then 1 else inexpire end as inexpire 

编辑

其实我只是在我的机器上进行快速测试数据类型的这种混合不会导致错误,但结果只是显示为Blob MySQL Workbench

SELECT 
cast(CASE WHEN inexpire < 0 THEN 'Expired' ELSE inexpire END as char) as inexpire 

stops这个问题如建议here。因此,这应该避免Byte[]问题

+1

我真的很惊讶MySQL在这种情况下不会引发错误。我认为,Sybase,MS&IBM DB2/UDB在来自案例的返回类型不同时(或者至少没有可用的隐式转换)会引发错误。我很想知道'inexpired'的实际数据库类型是什么。 – 2010-08-02 07:33:12

+0

@Nathan - 也许它确实只是将数字转换为字符串。目前我无法对此进行测试。 – 2010-08-02 07:37:55

+0

可以配置MySQL对这种表达式的行为。我认为默认情况下它最多会发出警告。 – Mchl 2010-08-02 07:43:43

1

IF(inexpire < 0, 'Expired',inexpire) AS inexpire