【问题标题】:SQL Using values in row to create different columnsSQL 使用行中的值创建不同的列
【发布时间】:2013-02-07 18:43:14
【问题描述】:

我的数据库中有几个表,我想从几个表中选择几个列,这很好。现在,有第三张表,该表有一个列,其中包含不同的文本值,但对于不同的用户,相同的几个“text_values”,例如:

表3

row userid  text_value  value
1   user1   text1       value1
2   user1   text2       value2
3   user2   text1       value3
4   user3   text1       value4
...

现在,我想从 Table1 中获取 INFO1 和 INFO2,从 Table2 中获取 INFO3 和 INFO4,然后我想从 Table3 中获取 text_value=text1 的所有值,并将其设为第 5 列,并使用 INFO5,然后从表 3 其中 text_value=text2 并将其设为第 6 列,信息为 6。

我有以下查询,如果我只想要 INFO5 列,则可以正常工作:

SELECT Table1.INFO1, Table1.userid , Table2.INFO2,
Table1.INFO3, Table2.INFO4,
Table3.value AS INFO5
FROM Table1 LEFT OUTER JOIN Table2 ON Table1.userid = Table2.userid 
LEFT OUTER JOIN Table3 ON Table1.userid = Table3.userid 
WHERE Table3.text_value = 'text1' 

但是,我想使用同一个 table3 VALUE 列中的值创建另一列,但是当 TEXT_VALUE = 'text2' 时(对于 'text3'、'text4' 是这样,因为有几个文本要“过滤"开)。

当我将查询更改为以下内容时,它不起作用:

SELECT Table1.INFO1, Table1.userid , Table2.INFO2,
Table1.INFO3, Table2.INFO4,
Table3.value AS INFO5 WHERE Table3.text_value = 'text1' 
Table3.value AS INFO6 WHERE Table3.text_value = 'text2' 
FROM Table1 LEFT OUTER JOIN Table2 ON Table1.userid = Table2.userid 
LEFT OUTER JOIN Table3 ON Table1.userid = Table3.userid 

任何指导将不胜感激。

【问题讨论】:

  • 其实答案是CASE WHEN

标签: sql select join multiple-columns


【解决方案1】:

你需要一个CASE

SELECT  Table1.INFO1, 
        Table1.userid, 
        Table2.INFO2,
        Table1.INFO3, 
        Table2.INFO4,
        CASE WHEN Table3.text_value = 'text1' THEN Table3.value END AS INFO5 
        CASE WHEN Table3.text_value = 'text2' THEN Table3.value END AS INFO6 
FROM Table1 
LEFT OUTER JOIN Table2 
    ON Table1.userid = Table2.userid 
LEFT OUTER JOIN Table3 
    ON Table1.userid = Table3.userid 

【讨论】:

  • 谢谢 Lamak,我想这就是我想要的。我必须弄清楚为什么我的一些输出是 NULL,但我认为这与其他表中的一些数据有关。
  • @Bc。其中一些列是NULL 的原因很简单。由于INFO5INFO6 在同一列上具有互斥条件,因此它们中只有一个可以为每一行返回一个值
  • 谢谢拉马克。有什么方法可以在单个列上使用排除条件,但仍然为 INFON 创建与另一个表中我的 USERID 对齐的列?也许我需要将此作为新问题提交
  • @Bc。我不太明白你想做什么,但它听起来是可以做到的。如果您在另一个问题上解释它,那么我很乐意提供帮助
【解决方案2】:

您的 where 语句位于错误的位置。它应该在连接之后:

主要 SQL 语法应为:

SELECT Table1.INFO1, Table1.userid , Table2.INFO2,
Table1.INFO3, Table2.INFO4,
Table3.value AS INFO5 
Table3.value AS INFO6 
FROM Table1 LEFT OUTER JOIN Table2 ON Table1.userid = Table2.userid 
LEFT OUTER JOIN Table3 ON Table1.userid = Table3.userid 
WHERE Table3.text_value = 'text1' 
and Table3.text_value = 'text2' 

【讨论】:

  • 这不起作用,因为它会在两个条件都为真时尝试返回值,所以一切都返回空白,因为 text1 永远不会等于 text2 在同一列上,这就是我使用它的原因要过滤的条件。
  • 然后使用 Lamak 的答案作为“case when”声明。您不能在 SQL 的 Select 语法中添加“Where”子句。我以为你想限制你的设置。如果您只想针对特定事件显示某些内容,则使用“Case When”(表达式)“THEN”(值)“END”。
  • 没问题,当您从一门语言开始时,学习语法是成功的一半。请记住关于 Case 的另一件事,当您可以带走时,您可以设置多个条件(不止一个 'When'),例如:“Case when val = 1 then 'I am 1' when val = 2 then 'I am 2' end" 但是,您也可以使用 'ELSE' 设置默认值,“如果 val = 1 则 'I am 1' 当 val = 2 则 'I am 2' 否则 'I am something else' end”。
【解决方案3】:

case 语句的替代方法是使用 Pivot 功能,如果您想在表 3 中添加更多 Info# 而无需进行不必要的连接,它可以让您进行扩展。

http://sqlfiddle.com/#!3/789c8/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多