【问题标题】:How to return a result as a column value if a row exists or not?如果行存在与否,如何将结果作为列值返回?
【发布时间】:2017-10-25 18:37:29
【问题描述】:

我有两个表 table1 和 table2。

table1 - tID,title,description

table2 - sID,tID,title,description

table1(t1) 总是包含值。 在 table2 (t2) 中,如果存在一行,则 tID(外键)将始终与 t1(主键)中的 tID 匹配。

我想创建一个 select 语句,从 t1 中选择所有列,并创建一个附加列“ex”,其值为真或假,具体取决于 t2 中是否存在 tID 匹配的记录...

Select t1.*, (some code) as ex from table1 t1,table2 t2;  

明白吗?例如,如果Select t1.*, t2.* from table1 t1, table2 t2 where t1.tID = t2.tID 返回任何行,ex 同样应该是真的......我该怎么做?

编辑:任何列都不能为空

编辑:忘了提,我希望 select 语句只匹配我指定的 sID = someIdValue ......

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    使用LEFT JOIN(外连接),然后使用IS NULL 表达式检查table2 中是否存在tID

    Select t1.*, t2.tid is not null as ex 
    from table1 t1
    left join table2 t2 on t1.tid = t2.tid
    

    demo

    编辑:“如果我只想要 sID 匹配某个值的值怎么办?”

    Select t1.*, t2.tid is not null as ex 
    from table1 t1
    left join table2 t2 on t1.tid = t2.tid and t2.sid = <some_value>
    

    【讨论】:

    • 我不明白 - 如果值为 null,我如何将其转换为 true false ?此外,无论如何,我的列都不能存储 null - 它们都必须具有值。
    • @KaizerSozay NULL 是外连接的产物。如果tid 存在于table2 中,则表达式t2.tid is null 返回true,否则返回false。
    • 如果我只想要 sID 匹配某个值的值怎么办?
    • @KaizerSozay 逻辑已被交换(如果有条目则显示为 false),现在已更正。
    • 关于如何匹配 sID 的任何建议?
    【解决方案2】:

    如果这对您有用,请尝试以下一种。

     declare @T1 as Table 
    (
    tId int,
    title varchar(25),
    description varchar(50)
    )
    
    declare @T2 as Table 
    (
    sid int,
    tId int,
    title varchar(25),
    description varchar(50)
    )
    insert into @t1 (tId,title,description) values(1,'abc','test')
    insert into @t1 (tId,title,description) values(2,'abc','test')
    insert into @t1 (tId,title,description) values(3,'abc','test')
    insert into @t1 (tId,title,description) values(4,'abc','test')
    insert into @t1 (tId,title,description) values(5,'abc','test')
    
    insert into @t2 (tId,title,description) values(10,'abc','test')
    insert into @t2 (tId,title,description) values(2,'abc','test')
    insert into @t2 (tId,title,description) values(3,'abc','test')
    insert into @t2 (tId,title,description) values(14,'abc','test')
    insert into @t2 (tId,title,description) values(5,'abc','test')
    
    Select distinct t1.*, 
       case when t2.tid is null then 'False' else 'True' end as ex from @T1 t1    
       left join @T2 t2 
       on t1.tId = t2.tId  
    

    输出

    1   abc test    False
    2   abc test    True
    3   abc test    True
    4   abc test    False
    5   abc test    True
    

    【讨论】:

    • declare @T1 as Table.. 在 postgres SQL 中是无效语法
    • 这些表只是示例,但逻辑相同
    【解决方案3】:

    试试这个

    select *, coalesce(tID = true, false) = true as is_exists from table1 t1
    left join table2 t2 using (tid)
    

    【讨论】:

    • 如果 tID 在每个表中有不同的名称,我将如何修改您的语句?不是很明显。
    • 这似乎不适用于 postgresql...错误只是强调了 false 关键字
    • @KaizerSozay 你是对的,在合并中搞乱了类型,已编辑
    • 知道如何匹配 sID 吗?
    • @KaizerSozay left join table2 t2 on t1.t1id = t2.t2id
    【解决方案4】:

    EXISTS(subquery) 产生一个布尔值,您可以直接使用它:


    SELECT t1.*
            , EXISTS(SELECT13 FROM table2 t2 WHERE t2.tID = t1.tID) AS does_exist
    FROM table1 t1
            ;
    

    • 这将产生 所有 t1 中的行,以及一个标志,表明 t2 中存在一个或多个相应的行。

    • 如果您想要在 t2 中具有匹配行的 t1 记录,请将 exists() 移动到 where 子句:


    SELECT t1.*
    FROM table1 t1
    WHERE EXISTS(SELECT13 FROM table2 t2 WHERE t2.tID = t1.tID) 
            ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 2019-04-04
      • 2022-01-10
      相关资源
      最近更新 更多