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】:如果我理解正确的话,你可以使用ISNULL
或COALESCE
如下
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 或空字符串 [重复]