【问题标题】:An expression of non-boolean type specified in a context where a condition is expected, near "WHEN"在预期条件的上下文中指定的非布尔类型的表达式,靠近“WHEN”
【发布时间】:2019-08-14 16:26:18
【问题描述】:

我怀疑这个错误...我无法解决。你能帮我解决吗?

    sql += Chr(13) & " "
    If Not Agrupar = "R" Then
        sql += Chr(13) & " GROUP BY  contas_receber.NumTitulo, contas_receber.AnoTitulo, b.CodParcela, b.NumParcela"
        sql += Chr(13) & "  , contas_receber.DataLancamento, b.DataVencimento , b.ValorParcela, b.ValorAReceber"
        sql += Chr(13) & " , CASE WHEN ISNULL(cli.NomeFantasia, func.Nome) WHEN ISNULL(func.Nome, forn.NomeFantasia) ELSE cli.NomeFantasia END"
        sql += Chr(13) & " , contas_receber.Historico, b.vRetencao"
        'sql += Chr(13) & " , ISNULL(cli.NomeFantasia, func.Nome), contas_receber.Historico, b.vRetencao"
        sql += Chr(13) & " , emp.NomeFantasia, cli.Nomefantasia, func.Nome, cli.Nomefantasia, contas_receber.EmNomeFuncionario, contas_receber.EmNomeFornecedor"
        sql += Chr(13) & " , contas_receber.NumFichaServico, contas_receber.PlacaFichaServico, pc.Conta, pc.Descricao"
    End If

    'sql += Chr(13) & " , CASE WHEN contas_receber.EmNomeFuncionario = 1 THEN func.Nome WHEN contas_receber.EmNomeFornecedor = 1 Then forn.NomeFantasia "
    'sql += Chr(13) & " ELSE ISNULL(cli.NomeFantasia,cli.NomeFantasia ) END Cliente"

    sql += Chr(13) & " ORDER BY contas_receber.AnoTitulo, contas_receber.NumTitulo  "

【问题讨论】:

  • @laancelot - 它是 VB 代码,所以使用 ' 很好......但我不认为问题出在提交的代码中,这是一个 group by......什么WHERE 子句的代码是什么样子的?
  • ISNULL() 如果第一个值不为 NULL,则将采用第一个值,当第一个值为 NULL 时将采用第二个值。我认为您没有意识到 ISNULL() 函数的用途。看来您可能想要WHEN cli.NomeFantasia IS NULL AND func.Nome IS NULL
  • 另外,您可以在 VB.NET 中使用与号 (&) 进行字符串连接。虽然+ 在技术上有效,但将 + 和 & 混合使用会更难阅读。从另一个阅读代码的开发人员的角度来看,一种更简洁的方法是使用 StringBuilder 并对 SQL 的每个“行”执行 StringBuilder.AppendLine("WHERE x = 123") - 而不是添加所有这些 Chr(13)。
  • 我强烈建议您在 Management Studio 或其他查询编辑器中编写您的查询,并让它在那里工作,然后再尝试对您在应用程序代码中拼凑在一起的查询进行故障排除。
  • 我强烈建议您将您的查询移动到存储过程,而不是在您的应用程序中一起处理大量查询。这将是创建分层应用程序的第一步,而且它更容易调试。

标签: sql-server vb.net


【解决方案1】:

我看到你在下一行有错误:

sql += Chr(13) & " , CASE WHEN ISNULL(cli.NomeFantasia, func.Nome) WHEN ISNULL(func.Nome, forn.NomeFantasia) ELSE cli.NomeFantasia END"

有两个WHEN 和后来的ELSE,也许您需要将最后一个WHEN 更改为THEN,或者您可能需要将两个WHENAND 之类的运算符连接起来或OR

【讨论】:

  • 另外,CASE WHEN ISNULL(cli.NomeFantasia, func.Nome) 不是一个可以求值的表达式。也许OP的意思是CASE WHEN COALESCE(cli.NomeFantasia, func.Nome) IS NULL THEN
  • sql += Chr(13) & " , CASE WHEN cli.NomeFantasia IS NULL AND forn.NomeFantasia IS NULL THEN func.Nome" sql += Chr(13) & " WHEN func.Nome IS NULL AND forn.NomeFantasia IS NULL THEN cli.NomeFantasia" sql += Chr(13) & " WHEN cli.NomeFantasia IS NULL AND func.Nome IS NULL THEN forn.NomeFantasia END"
  • 我的猜测是整个case表达式可以简化为coalesce(cli.NomeFantasia, func.Nome, cli.NomeFantasia)
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2011-09-22
  • 2013-02-11
相关资源
最近更新 更多