Sql 如何在SELECT子句中创建一个新列,并在满足所有条件语句的条件下动态地用字符串/列表填充它?

Sql 如何在SELECT子句中创建一个新列,并在满足所有条件语句的条件下动态地用字符串/列表填充它?,sql,postgresql,amazon-redshift,Sql,Postgresql,Amazon Redshift,因此,数据库中有两个表。我必须根据某些条件找出哪一行存在差异(在一些情况下,这只是字段之间的相等性检查)。我报告这些行的ID 问题还在于在另一列中包含报告该ID的原因。因为一个id可能在多个条件下失败(比如两个字段不匹配),所以我只想在另一列中包含所有这些原因 基本思想是将所有不匹配项追加到另一列中 我已经研究了几个SO问题,但它们并不完全符合我的用例。所以现在我认为使用SQL是不可能的 我在Google上搜索“根据sql条件输入动态列值”,然后点击::这添加了一个静态列 我还了解到,可以在SE

因此,数据库中有两个表。我必须根据某些条件找出哪一行存在差异(在一些情况下,这只是字段之间的相等性检查)。我报告这些行的ID

问题还在于在另一列中包含报告该ID的原因。因为一个id可能在多个条件下失败(比如两个字段不匹配),所以我只想在另一列中包含所有这些原因

基本思想是将所有不匹配项追加到另一列中

我已经研究了几个SO问题,但它们并不完全符合我的用例。所以现在我认为使用SQL是不可能的

我在Google上搜索“根据sql条件输入动态列值”,然后点击::这添加了一个静态列

我还了解到,可以在SELECT中添加另一列动态内容,如下所示:

SELECT id, CASE 
WHEN columnname "DEF" then "I" ELSE "YOU" newColumnName
FROM tableName
但我一直无法找到动态列值赋值和更新SQL。这就是问题所在

预期成果:

  • 我只想能够将记录适用于的所有案例“字符串”合并
  • 用这两张桌子做这个
  • 因为我有两个表要处理,所以我必须把这些条件放在WHERE子条款中,而不是选择一个

    所以,如果ID=345,两个表之间的列“FOO_MAN”不匹配,列“BAR_TOO”也不匹配,那么

    然后我希望我的select子句捕获如下信息:

    ID      | REASON
    345     | FOO_MAN BAR_TWO
    

    根据要测试的条件动态构建这种类型的查询(例如,使用存储过程)可能更容易,但下面是一个小示例,演示了如何实现:

    SELECT t1.id,
           CONCAT_WS(' ',
                     CASE WHEN t1.foo != t2.foo THEN 'foo' END,
                     CASE WHEN t1.bar != t2.bar THEN 'bar' END
                     ) AS reason
    FROM t1
    JOIN t2 ON t2.id = t1.id
    WHERE t1.foo != t2.foo OR t1.bar != t2.bar
    
    输出(针对我的)


    根据要测试的条件动态构建这种类型的查询(例如,使用存储过程)可能更容易,但下面是一个小示例,演示了如何实现:

    SELECT t1.id,
           CONCAT_WS(' ',
                     CASE WHEN t1.foo != t2.foo THEN 'foo' END,
                     CASE WHEN t1.bar != t2.bar THEN 'bar' END
                     ) AS reason
    FROM t1
    JOIN t2 ON t2.id = t1.id
    WHERE t1.foo != t2.foo OR t1.bar != t2.bar
    
    输出(针对我的)


    你可能有多少个条件?根据不同的列,我可能有大约7或8个这样的条件。如果我有一个标记字符串(表示该记录是否与条件“条件_1”匹配),那么如果该记录与另一个记录匹配,则生成的列应该成为该ID字段的“条件_1条件2”。PL/SQL和MySQL是两个非常不同的东西。请使用您真正使用的数据库进行标记。感谢您将其命名为@GordonLinoff!我会取下标签。还有,你的个人资料太棒了!我渴望在几年内有一个类似的。你有什么建议吗?谢谢。:)你可能有多少个条件?根据不同的列,我可能有大约7或8个这样的条件。如果我有一个标记字符串(表示该记录是否与条件“条件_1”匹配),那么如果该记录与另一个记录匹配,则生成的列应该成为该ID字段的“条件_1条件2”。PL/SQL和MySQL是两个非常不同的东西。请使用您真正使用的数据库进行标记。感谢您将其命名为@GordonLinoff!我会取下标签。还有,你的个人资料太棒了!我渴望在几年内有一个类似的。你有什么建议吗?谢谢。:)存储过程意味着在现有表中创建一个额外的列?我已经标记为已接受,因为dbfiddle演示似乎是我的用例。如果在实际测试中失败,我会更新。谢谢你的速度,尼克@RohanKumar不担心。没有必要接受,除非你对答案完全满意。我注意到您更改了问题的标记,因此我已将更新为postgresql(但实际上并没有更改查询)。@RohanKumar
    concat
    不关心其参数是否为静态。您可能需要使用
    ELSE
    子句来处理
    NULL
    值:@RohanKumar我很高兴听到这解决了这个问题
    CONCAT_WS
    自动忽略
    NULL
    值,这就是为什么我的原始查询不需要
    ELSE
    子句的原因。存储过程意味着在现有表中创建一个额外的列?我已经标记为已接受,因为dbfiddle演示似乎是我的用例。如果在实际测试中失败,我会更新。谢谢你的速度,尼克@RohanKumar不担心。没有必要接受,除非你对答案完全满意。我注意到您更改了问题的标记,因此我已将更新为postgresql(但实际上并没有更改查询)。@RohanKumar
    concat
    不关心其参数是否为静态。您可能需要使用
    ELSE
    子句来处理
    NULL
    值:@RohanKumar我很高兴听到这解决了这个问题
    CONCAT_WS
    会自动忽略
    NULL
    值,这就是我最初的查询不需要
    ELSE
    子句的原因。