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

时间:2014-09-10 02:17:45

标签: sql-server tsql select exists isnull

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

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

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

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

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

必须有更好的方法,对吧?

我使用EXISTS运算符尝试了几种不同的方法,但无处可去。

1 个答案:

答案 0 :(得分:1)

如果我理解了您的任务,您可以加入tableA以检查是否存在特定记录 - 如果记录不存在,您将获得NULL加入的值,否则您需要&#39 ;有一些价值。然后,如果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