【问题标题】:ODBC SQL query to create two columns for debit and credit from oneODBC SQL 查询从一列创建借方和贷方两列
【发布时间】:2012-12-13 19:14:39
【问题描述】:

我们正在使用 VB .NET 和 2.0 .NET 框架连接到专有的 ODBC 源。我们正在提取余额字段(其中正值是借方,负值是贷方)以及其他信息。

以下查询不可能,因为不支持大小写:

Dim strQuery As String = "SELECT ACCOUNT_REF, " + _
"CASE WHEN [BALANCE] < 0 THEN BALANCE ELSE NULL END, " + _
"CASE WHEN [BALANCE] > 0 THEN BALANCE ELSE NULL END " + _
"FROM TABLE1 WHERE BALANCE <> 0"

我们可以在使用 DataSet 时将 Balance 列一分为二吗?如果有,有什么例子吗?

我们正在使用以下代码来构建我们的数据集(因为此专有实现不支持大小写):

        Dim strQuery = "Select ACCOUNT_REF, BALANCE FROM TABLE1 WHERE BALANCE <> 0"
        Using connection
            Using adapter As New Odbc.OdbcDataAdapter(strQuery, connection)
                Dim ds As New DataSet()
                adapter.Fill(ds)
            End Using
        End Using

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 我很确定 case 语句中没有尾随大小写:CASE WHEN [BALANCE] &lt; 0 THEN BALANCE ELSE NULL END 应该可以工作。
  • 您的意思是执行类似“SELECT ACCOUNT_REF, BALANCE as DEBITS, BALANCE as CREDITS...”之类的操作吗?
  • 我们也尝试过 - 谢谢 - 我们正在连接到 Sage Accounts 50。
  • 没错,David - 我不太擅长 SQL,因为我主要使用 No-SQL 数据库。在不使用 CASE 的情况下使用 ODBC 是否可以轻松完成?
  • 您是否有限制在 .NET 代码中将借方与贷方分开?

标签: sql odbc


【解决方案1】:

你试过了吗:

SELECT Account_Ref, Balance as Debits, NULL as Credits
FROM Table1
WHERE Balance < 0
UNION ALL
SELECT Account_Ref, NULL as Debits, Balance as Credits
FROM Table1
WHERE Balance > 0

笨重,但可能支持 UNION 或 UNION ALL 而 CASE 不支持。

【讨论】:

  • 即使 union 在这个专有实现中也不起作用!!非常感谢这个想法,我想我可能会找到一种方法来组合这两个 DataSet 并且可以解决问题。
  • 感谢 Stuart,我们决定使用 Linq 来处理 DataSet。由于 Sage 也没有实现 Union。
【解决方案2】:

我很惊讶地看到 VB.NET 下的 ODBC 不支持这种情况。我对 VB.NET 了解不多,但也许是因为您忘记为您的案例命名?尝试:

Dim strQuery As String = "SELECT ACCOUNT_REF, " + _
"CASE WHEN [BALANCE] < 0 THEN BALANCE ELSE NULL END as Debits, " + _
"CASE WHEN [BALANCE] > 0 THEN BALANCE ELSE NULL END as Credits " + _
"FROM TABLE1 WHERE BALANCE <> 0"

也有可能无法识别分隔符[]。 SQL 中的官方分隔符是双引号 " 。但是,由于名称 Balance 没有什么特别之处,您应该放弃这些:

Dim strQuery As String = "SELECT ACCOUNT_REF, " + _
"CASE WHEN BALANCE < 0 THEN BALANCE ELSE NULL END as Debits, " + _
"CASE WHEN BALANCE > 0 THEN BALANCE ELSE NULL END as Credits " + _
"FROM TABLE1 WHERE BALANCE <> 0"

否则,您应该使用存储过程而不是查询字符串。

【讨论】:

  • 如果这是一个合适的 SQL DB,这将是有意义的,但这是 Sage 自己的 ODBC 实现,他们已经确认他们只实现了他们需要的东西,因为 ODBC 不受他们的官方支持.看起来他们还没有实现 IF、CASE 或 UNION!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多