【问题标题】:Pulling off a SQL "IF/Else" in complex query在复杂查询中提取 SQL“IF/Else”
【发布时间】:2013-07-05 19:24:45
【问题描述】:

我需要为一些从我没有创建的数据库中提取数据的帐户做一个声明。现在这个特定的表有点奇怪,我很难把它拉下来。基本上这里是此刻的查询......

string query = "SELECT Date, TransCode, Amount, BalanceDebito, BalanceCredito FROM ledger WHERE (DR_Socio = @SocioNum) OR (CR_SOCIO = @SocioNum) ORDER BY Date DESC";

我一直在阅读有关 TRANSACT 和其他内容的信息,但我无法得出一个查询,该查询确定 DR_Socio 是否与 @SocioNum 相同,则 BalanceDebito 成为 Balance 列,否则 CR_SOCIO 是否与 @ 相同SocioNum 然后名为 BalanceCredit 的列成为 Balance 列,如果 CR_Socio 和 DR_Socio 列都与 @SocioNum 相同,则它不应传递任何值。基本上……

If DR_Socio = @SocioNum THEN
BalanceDebito as Balance 
Else if CR_Socio @SocioNum then
BalanceCredito as Balance
Else If CrSocio and Dr_Socio = @SocioNum then
Do Nothing
End If

这就是它的要点。我需要把它变成一个 SQL 查询。 BalanceDebito 和 BalanceCredito 是两个不同的列,我需要将它们作为一个列用于报告目的,因为我正在创建 PDF(上帝保佑 iTextSharp),但我不能有 BalanceDebito 和 BalanceCredito 的两列。这可能吗?我很卡住,不知道如何进行。帮助将不胜感激。我正在使用 C#、ASP.NET、MVC 进行编程,使用 iTextSharp dll 来创建 PDF(效果很好),并使用 SQL Server 2008 来创建数据库。

【问题讨论】:

  • 案例陈述是您所需要的。像 If/elseif 一样按顺序求值。

标签: sql-server sql-server-2008 c#-4.0


【解决方案1】:

这个查询应该给你你想要的:

SELECT  Date, 
        TransCode, 
        Amount, 
        CASE WHEN DR_Socio = @SocioNum THEN BalanceDebito
        WHEN CR_SOCIO = @SocioNum THEN BalanceCredito END Balance
FROM ledger 
WHERE (DR_Socio = @SocioNum OR CR_SOCIO = @SocioNum)
AND DR_Socio <> CR_SOCIO
ORDER BY [Date] DESC

【讨论】:

  • 完美运行。现在我也知道如何处理进一步的查询了,非常感谢 Lamak。
  • @LordRelix 没问题,很高兴它有帮助
  • 对于自我文档,我总是在 END 之前添加 ELSE 语句。在你的情况下,ELSE NULL END
【解决方案2】:

CASE 语句应该满足您的需求:

SELECT

CASE 
    WHEN Cr_Socio = @SocioNum AND Dr_Socio = @SocioNum THEN NULL
    WHEN DR_Socio = @SocioNum THEN BalanceDebito 
    WHEN CR_Socio = @SocioNum THEN BalanceCredito 
END AS Balance 

FROM ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 2013-05-22
    • 2012-07-16
    • 2023-04-02
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多