t-sql 如果记录存在则选择一列,如果不存在则选择不同的列

Posted

技术标签:

【中文标题】t-sql 如果记录存在则选择一列,如果不存在则选择不同的列【英文标题】:t-sql select one column if record exists, different column if not 【发布时间】:2014-09-10 02:17:44 【问题描述】:

我经常发现自己需要从两个不同的表 tableA 和 tableB 之一中选择一个值。如果 tableA 中存在某条记录,我从 tableA 中获取值。如果记录不存在,我需要来自 tableB 的值。

我正在使用 ERP 应用程序,如果用户在输入销售订单时更改了默认收货地址,它将在销售订单收货地址表中创建基于事件的记录。如果用户不更改收货地址,则系统假定产品正在运送到客户文件中的地址,并且不会向销售订单收货表写入任何内容。我需要每个销售订单发货的收货地址,但直接从 tableA 或 tableB 获取它并不安全。

我过去做过的事情是这样的:

SELECT
    CASE 
        WHEN isnull(tableA.SalesOrderNumber, '***') = '***'
            THEN tableB.address1
        ELSE tableA.address1
        END AS address1

哪个有效。但是你最终会一遍又一遍地为每个具有相似逻辑的字段重复同样的事情,这很糟糕,但如果你正在检查的值 (SalesOrderNumber) 是基于字符的数据和/或主键,这并不是不可行的.如果我要检查的值不是主键或者它是数字类型数据,那么这种方法会变得更加脆弱。

一定有更好的方法,对吧?

我用EXISTS 操作符尝试了几种不同的方法,但都没有成功。

【问题讨论】:

如果你经常需要这种东西,为什么不使用函数 概念是重复的,机制不是。另外,我这样做是为了报告的目的,所以我必须能够将它合并到一个视图中。为结果视图中的每一行为 9 个不同的字段调用 9 个不同的标量函数会很慢 如果你可以改变数据库结构,我会建议一个不同的方法:与其创建这么大的混乱视图,我建议将这9列添加到订单表中,当客户提交订单时表单,使用来自客户保存的数据或表单的值填充此列。你仍然需要做这个案例......当有 9 个字段时,但只在一个地方。 【参考方案1】:

如果我了解您的任务,您可以离开加入您的 tableA 以检查特定记录是否存在 - 如果记录不存在,您将拥有 NULL 用于连接值,否则您将有一些价值。然后在NULL 值的情况下,您可以将其替换为来自tableB 的值。像这样的:

SELECT COALESCE(tA.address1, tB.address1, N'N/A') AS address1
    FROM tableWithSalesOrderNumbers AS tWSON
             LEFT JOIN tableA AS tA
                 ON tA.SalesOrderNumber = tWSON.SalesOrderNumber
             LEFT JOIN tableB AS tB
                 ON tB.SalesOrderNumber = tWSON.SalesOrderNumber

【讨论】:

这真是太棒了,更不用说更优雅了。我以前从未使用过 coalesce() ,但我知道我让它变得比它需要的更困难。谢谢

以上是关于t-sql 如果记录存在则选择一列,如果不存在则选择不同的列的主要内容,如果未能解决你的问题,请参考以下文章

如果存在,则 T-SQL 删除类型 [重复]

T-SQL:比较两个表 - 第二个表中不存在的记录

如果存在于列表中,则根据另一列的值选择列

SQL - 如果 OLEQuery 中存在,则选择列

SQLServer之删除约束

HSQLDB 如果不存在则插入,如果存在则更新