SQL 从 2 列中选择数据,如果它不为 NULL,则插入到视图中

Posted

技术标签:

【中文标题】SQL 从 2 列中选择数据,如果它不为 NULL,则插入到视图中【英文标题】:SQL Selecting Data from 2 columns and inserting into view if it is not NULL 【发布时间】:2017-03-10 11:06:19 【问题描述】:

我有一个从多个表中提取数据的视图。在视图的一个列中,我需要插入一个帐户代码,该帐户代码可以在其中一个表的贷方或借方列下找到。如果借方栏中有帐户代码,则贷方栏中不会有帐户代码,反之亦然。基本上,如果在任一列中找到帐户代码,我都需要插入它。

由于 UNION,我无法更改视图列。

也许我正在使用错误的关键字搜索此信息,但我似乎找不到我需要的内容。

谢谢。

使用查询更新

    SELECT
DET_YEAR as [Year],
DET_PERIODNUMBR as [Period],
DET_TYPE AS [Type],
'' AS [Status],
DET_Date AS [Tran Date],
'' AS [Supplier],
'' AS [Supplier Name],
DET_DESCRIPTION as [Description],
DET_DIMENSION3 AS [Department],
'' as [Entry Type],
'' as [Detail],
DET_GROSS as [Value],
DET_COSTHEADER as [Project Code],
CH_NAME as [Project Name], 
DET_COSTCENTRE AS [Project Cost Centre],
'' AS [Analysis Code],
'' AS [Analysis Name],
'' AS [Nominal Code],
'' AS [Account Name],
DET_NOMINALDR as [DebitNominal],
DET_NOMINALCR AS [CreditNominal],
NNAME as [Dr/CrNominalName], 
'' AS POH_ORDER_NUMBR,
DET_BATCH_REF


FROM SL_PL_NL_DETAIL WITH (NOLOCK)
LEFT JOIN CST_COSTHEADER WITH (NOLOCK) ON DET_COSTHEADER = CH_CODE
LEFT JOIN CST_COSTCENTRE WITH (NOLOCK) ON DET_COSTCENTRE = CC_CODE AND DET_COSTHEADER = CC_COPYHEADER
INNER JOIN NL_ACCOUNTS WITH (NOLOCK) ON (DET_NOMINALDR = NCODE OR DET_NOMINALCR = NCODE)

WHERE DET_TYPE IN ('JNL', 'VJL') AND DET_BATCH_FLAG = 0 AND DET_YEAR IN ('C', 'N'))

【问题讨论】:

您使用的是哪个 dbms? 您能否向我们展示表结构 - 或者如果它们很大,列的相关子集 - 以及您尝试了什么? 我正在使用 MSSQL 向我们展示一些基表示例数据、视图定义以及当前和想要的结果。 我需要将 DET_NOMINALDR 或 DET_NOMINALCR 放入 Nominal Code,当前结果分布在 2 列中。 【参考方案1】:

您可以使用 CASE 语句 - 看不到您的表格,我只是猜测,但您可以执行以下操作:

SELECT ....,
    CASE WHEN credit IS NOT NULL THEN credit ELSE debit END AS account_code,
    -- (etc)

当然,如果列不为空,您可以根据需要使用任何其他条件。

【讨论】:

CASE WHEN DET_NOMINALDR IS NOT NULL THEN DET_NOMINALDR ELSE DET_NOMINALCR END AS [Nominal Code],与其他建议的问题相同。 CR 和 DR 列可以为空吗?如果没有,那么您需要使用其他条件来测试它们。如果您想要的帐户代码不存在,它们会显示什么? 我可能有问题,因为它们是字符串格式,例如 '1222-1020' 这很好,但是当帐户代码不存在时,任一列中会出现什么? - 比如账户代码在CR栏,DR栏是什么? 如果 CR 中有帐户,则 DR iis 为“空白”或 NULL【参考方案2】:

如果我理解正确的话,你可以使用ISNULLCOALESCE如下

ISNULL(a.column, b.column)
OR
COALESCE(a.column, b.column....)  
--We can define multiple columns but it will return first NOT NULL value

看看这个例子:

CREATE TABLE #testOne(id int identity(1,1), 
    accountDebit varchar(50), accountCredit varchar(50))

insert into #testOne values
(null, '1222-1020')

select * from #testOne

id  accountDebit    accountCredit
1   NULL            1222-1020

select id, 
    isnull(accountDebit, accountCredit) AS account_code 
from #testOne

输出

id  account_code
1   1222-1020

【讨论】:

ISNULL(DET_NOMINALDR, DET_NOMINALCR) AS [Nominal Code] 不起作用,只有借记卡被添加到 Nominal Code 借方栏中的值是多少?如果甚至 0 则您必须使用 as ISNULL(NULLIF(debit,0),NULLIF(credit,0)) 或检查空白 ISNULL(NULLIF(debit,''),NULLIF(credit,'')) 我可能有问题,因为它们是字符串格式,例如 '1222-1020' 我已经用例子更新了我的答案,请看看并尝试做相应的事情。如果您的列包含 0 或空白,请使用 NULLIF 进行检查。

以上是关于SQL 从 2 列中选择数据,如果它不为 NULL,则插入到视图中的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中使用innot in 查询时,注意条件范围中的null值处理事项

Mongoose:唯一字段,如果它不为 null 或空字符串 [重复]

SQL 选择较早的日期(包括 NULL)

将 2 列中的值合并为 pandas 数据框中的单列

2021-01-02-Mysql(SQL题如果为null 则取上一条不为null的值)

SqlSever基础 count 查询某一列中不为NULL的行数