【问题标题】:Conversion error using CASE on a varchar column在 varchar 列上使用 CASE 的转换错误
【发布时间】:2017-08-18 21:18:42
【问题描述】:

我正在尝试获取信息以发送到 Google 图表以获取图表,我正在查看 Active 列,该列可以是真/假,但在我的数据库中设置为 varchar。

使用这个查询:

SELECT
    SUM(CASE WHEN CONVERT(int, Active) Active = 1 THEN 1 ELSE 0 END) AS Active,
    SUM(CASE WHEN CONVERT(int, Active) Active = 0 THEN 1 ELSE 0 END) AS Inactive
FROM 
    Events

抛出此错误:

将 varchar 值“True”转换为数据类型 int 时转换失败。`

【问题讨论】:

  • 为什么Active 不是位列而是 varchar 列?
  • 转换为 bit 而不是 int 应该可以工作
  • @TimSchmelter 应该是,但是现在我已经构建了一个完整的系统,并且害怕更改类型,因为它可能会影响我应用程序中的许多其他地方。

标签: tsql sql-server-2012


【解决方案1】:

Int 不是布尔值......它们在 SQL Server 中被称为 bit。试试;

SELECT
SUM(CASE WHEN CONVERT(bit, Active) = 1 THEN 1 ELSE 0 END) AS Active,
SUM(CASE WHEN CONVERT(bit, Active) = 0 THEN 1 ELSE 0 END) AS Inactive
FROM Events

或者只是测试你的字符串

SELECT
SUM(CASE WHEN Active = 'True' THEN 1 ELSE 0 END) AS Active,
SUM(CASE WHEN Active = 'False' THEN 1 ELSE 0 END) AS Inactive
FROM Events

附:将布尔值存储为字符串列是愚蠢的...考虑将列更改为位列,这样您甚至不需要转换它

【讨论】:

  • 这给了我An expression of non-boolean type specified in a context where a condition is expected, near 'Active'.
  • 那只是因为你不能在子查询中为你的列加上别名...删除该行中的第二个 Active 就像我的样子
  • 感谢编辑,确实有效。 12分钟一到就会接受。谢谢。
  • 反之,如果您需要显示True,请将bit 转换为string,但不要将其作为文本存储在表格中。
  • @TimSchmelter - 是的......这确实正是我所说的“考虑将列更改为位列”的建议
猜你喜欢
  • 2012-08-16
  • 1970-01-01
  • 2021-03-31
  • 2013-12-30
  • 2018-08-20
  • 2020-10-24
  • 2015-11-03
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多