【问题标题】:Can we choose columns in the table using a CASE subquery inside the SELECT in SQL?我们可以在 SQL 的 SELECT 中使用 CASE 子查询来选择表中的列吗?
【发布时间】:2019-06-04 21:34:56
【问题描述】:

我有一张主桌和两张辅助桌。我需要将所有三个表中的信息提取到一个表中。但是,这两个支持表有相互冲突的信息。因此,在大表中,只有某些行应该具有来自一个支持表的值,而其他行应该具有来自另一个支持表的值。我想使用 CASE 语句根据某些条件选择输入的数据

此 sql 代码位于 R 语言代码中,用于其他目的。但是sql代码是独立的,没有错误与R代码有关。 A.A11 和 C.C1 都是类型字符,而 A.A12 和 C.C1 都是数字。

"SELECT ",
                 "A.A1, A.A3,",
                 "CASE",
                 "WHEN A.A12 = 0 THEN C.C6, C.C7",
                 "ELSE B.B6, B.B7",
                 "END",
                 "FROM ((A",
                 "INNER JOIN B",
                 "ON A.A12 = B.B1)",
                 "INNER JOIN C",
                 "ON CAST(A.A11 AS varchar(10)) = CAST(C.C1 AS varchar(10)))"
Warning in sqlExecute(con, query, sqlParams, fetch = TRUE, stringsAsFactors = FALSE) :
  42000 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near ','.
Warning in sqlExecute(con, query, sqlParams, fetch = TRUE, stringsAsFactors = FALSE) :
  42000 8180 [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared.
Warning: Error in sqlExecute: 42000 102 [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near ','.
42000 8180 [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared.
[RODBCext] Error: SQLExecute failed

【问题讨论】:

  • 每个字段都需要一个 case 语句。因此,例如,您不能拥有THEN C.C6, C.C7
  • 请将您的输入减少到说明问题所需的最小值,然后如果 A、B 和 C 是输入数据帧,则显示 dput(A)、dput(B) 和 dput( C) 并显示预期结果。
  • 抱歉,您能详细说明每个字段是什么意思吗?

标签: sql r select case


【解决方案1】:

据我所知,你想按照这些思路做一些事情......

SELECT
A.A1, 
A.A3,
CASE WHEN A.A12 = 0 THEN C.C6 ELSE B.6 END AS X6,
CASE WHEN A.A12 = 0 THEN C.C7 ELSE B.7 END AS X7,
FROM A INNER JOIN B ON A.A12 = B.B1
       INNER JOIN C ON CAST(A.A11 AS varchar(10)) = CAST(C.C1 AS varchar(10))

【讨论】:

  • 你能告诉我 X6 和 X7 是什么意思吗?为什么它应该在那里?
  • 我在我的代码中尝试了这个(没有 AS X6 和 AS X7)但它不起作用。当尝试将其作为 R 语言的查询提交时,此代码是否易于使用?
  • 这是ANSI SQL语法,不知道对R语言的友好程度。你能描述什么不起作用吗?不编译?不返回你想要的?
  • 我的错误,是两个case语句之间的逗号或缺少逗号导致了错误
  • 正如其他人在上面评论的那样,在您的原始查询中,您在一个 CASE 语句中提到了两列,它们之间有一个逗号(“WHEN A.A12 = 0 THEN C.C6, C.C7” ),而在 ANSI SQL 中你不能这样做。所以,我只是将您的 CASE 语句分成两个 CASE 语句。 AS X6 & X7 只是给出一个列名,对于一个可能包含 C6 或 B6、C7 或 B7 的列,因此,只是给它一个中性名称 X,但保留 6 和 7。
猜你喜欢
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2017-03-18
相关资源
最近更新 更多