如何从下面过滤特定记录?
How to filter specific records from the below?
我有一个 table (Mytable),其值如下;
CustNo Audit History Inputter Authoriser
1 CHANGE CURRENT XYZ XYZ
2 CHANGE BEFORE XYZ XYZ
2 CHANGE CURRENT TOM TOM
3 ADD NEW TOM TOM
如果 Inputter 和 Authoriser 的值是 'XYZ' 且 Audit = 'CHANGE' 和 History = 'CURRENT',我只需要过滤掉记录,但它可以将 Audit 和 history 作为Inputter 和 Authoriser 的 CHANGE 和 BEFORE 分别具有值 'XYZ' 和其他记录
我的预期输出如下:
CustNo Audit History Inputter Authoriser
2 CHANGE BEFORE XYZ XYZ
2 CHANGE CURRENT TOM TOM
3 ADD NEW TOM TOM
我使用了下面的但我没有得到我例外的东西;
select * from Mytable
where (Inputter != 'XYZ' and Authoriser != 'XYZ' and Audit != 'CHANGE' and History != 'CURRENT' )
谁能指正一下,如何达到我的预期输出。提前致谢。
**请编辑我的要求,以下是新的例外情况; **
现在我的现有需求中需要添加另一个场景,
下面是 table 条记录;
CustNo Audit History Inputter Authoriser
1 ADD NEW Sasha Sasha
1 CHANGE BEOFRE MAX MAX
1 CHANGE CURRENT XYZ XYZ
2 CHANGE BEFORE XYZ XYZ
2 CHANGE CURRENT TOM TOM
3 ADD NEW TOM TOM
3 CHANGE CURRENT MAX MAX
如果任何输入者和授权者有 'XYZ'
审计和历史记录有 'CHANGE'
和 'CURRENT'
那么该记录应该与任何事件一起删除(这是现有的工作) table.
中的相同custNo
例如,这里 custNo = 1
有 'XYZ'
和 'CHANGE'
& 'CURRENT'
,
所以这应该连同删除;
custNo = 1
与 'CHANGE'
& 'BEOFRE'
对于 'MAX'
和
custNo = 1
与 'ADD'
& 'NEW'
对于 'Sasha'
换句话说 - 删除任何出现的相同 CustNo (在 Inputter 和 Authoriser 字段中都有 'XYZ'
,在 'CHANGE'
和 'CURRENT'
中审计和历史字段),不管任何审计和历史,即使该客户在输入者和授权人字段中没有 'XYZ'
。
新的预期输出:
CustNo Audit History Inputter Authoriser
2 CHANGE BEFORE XYZ XYZ
2 CHANGE CURRENT TOM TOM
3 ADD NEW TOM TOM
3 CHANGE CURRENT MAX MAX
而不是 AND
在条件
中使用 OR
select * from Mytable
where (Inputter != 'XYZ' or Authoriser != 'XYZ' or Audit != 'CHANGE' or History != 'CURRENT' )
输出:
Audit History Inputter Authoriser
Change before xyz xyz
Change CURRENT TOM TOM
ADD NEW TOM TOM
您有一个选择是执行以下操作。使用 CASE 语句过滤出 xyz 匹配特定条件的记录
select *
from Mytable a
where CASE WHEN a.Inputter=a.Authoriser AND a.Inputter='XYZ' AND a.Audit='CHANGE' AND a.History ='CURRENT'THEN
NULL
ELSE a.History
END = a.History
您可以使用 minus
设置运算符:
with t( CustNo, Audit, History, Inputter, Authoriser ) as
(
select 1,'CHANGE','CURRENT','XYZ','XYZ' union all
select 2,'CHANGE','BEFORE','XYZ','XYZ' union all
select 2,'CHANGE','CURRENT','TOM','TOM' union all
select 3,'ADD','NEW','TOM','TOM'
)
select * from t
minus
select *
from t
where Audit = 'CHANGE'
and History = 'CURRENT'
and Authoriser = 'XYZ';
CustNo Audit History Inputter Authoriser
------- ------ -------- -------- ----------
2 CHANGE BEFORE XYZ XYZ
2 CHANGE CURRENT TOM TOM
3 ADD NEW TOM TOM
或者可以使用 not in
:
select *
from t
where ( Audit, History, Authoriser ) not in
(
select Audit, History, Authoriser
from t
where Audit = 'CHANGE'
and History = 'CURRENT'
and Authoriser = 'XYZ' );
最简单的做法是使用 not
:
SELECT CustNo, Audit, History, Inputter, Authoriser
FROM MyTable
WHERE NOT (
Inputter = 'XYZ'
AND Authoriser = 'XYZ'
AND Audit = 'CHANGE'
AND History = 'CURRENT'
)
update:至于新需求,用not exists很容易搞定:
SELECT CustNo, Audit, History, Inputter, Authoriser
FROM MyTable t0
WHERE NOT EXISTS
(
SELECT 1
FROM MyTable t1
WHERE t1.CustNo = t0.CustNo
AND Inputter = 'XYZ'
AND Authoriser = 'XYZ'
AND Audit = 'CHANGE'
AND History = 'CURRENT'
)
我有一个 table (Mytable),其值如下;
CustNo Audit History Inputter Authoriser
1 CHANGE CURRENT XYZ XYZ
2 CHANGE BEFORE XYZ XYZ
2 CHANGE CURRENT TOM TOM
3 ADD NEW TOM TOM
如果 Inputter 和 Authoriser 的值是 'XYZ' 且 Audit = 'CHANGE' 和 History = 'CURRENT',我只需要过滤掉记录,但它可以将 Audit 和 history 作为Inputter 和 Authoriser 的 CHANGE 和 BEFORE 分别具有值 'XYZ' 和其他记录
我的预期输出如下:
CustNo Audit History Inputter Authoriser
2 CHANGE BEFORE XYZ XYZ
2 CHANGE CURRENT TOM TOM
3 ADD NEW TOM TOM
我使用了下面的但我没有得到我例外的东西;
select * from Mytable
where (Inputter != 'XYZ' and Authoriser != 'XYZ' and Audit != 'CHANGE' and History != 'CURRENT' )
谁能指正一下,如何达到我的预期输出。提前致谢。
**请编辑我的要求,以下是新的例外情况; **
现在我的现有需求中需要添加另一个场景, 下面是 table 条记录;
CustNo Audit History Inputter Authoriser
1 ADD NEW Sasha Sasha
1 CHANGE BEOFRE MAX MAX
1 CHANGE CURRENT XYZ XYZ
2 CHANGE BEFORE XYZ XYZ
2 CHANGE CURRENT TOM TOM
3 ADD NEW TOM TOM
3 CHANGE CURRENT MAX MAX
如果任何输入者和授权者有 'XYZ'
审计和历史记录有 'CHANGE'
和 'CURRENT'
那么该记录应该与任何事件一起删除(这是现有的工作) table.
custNo
例如,这里 custNo = 1
有 'XYZ'
和 'CHANGE'
& 'CURRENT'
,
所以这应该连同删除;
custNo = 1
与 'CHANGE'
& 'BEOFRE'
对于 'MAX'
和
custNo = 1
与 'ADD'
& 'NEW'
对于 'Sasha'
换句话说 - 删除任何出现的相同 CustNo (在 Inputter 和 Authoriser 字段中都有 'XYZ'
,在 'CHANGE'
和 'CURRENT'
中审计和历史字段),不管任何审计和历史,即使该客户在输入者和授权人字段中没有 'XYZ'
。
新的预期输出:
CustNo Audit History Inputter Authoriser
2 CHANGE BEFORE XYZ XYZ
2 CHANGE CURRENT TOM TOM
3 ADD NEW TOM TOM
3 CHANGE CURRENT MAX MAX
而不是 AND
在条件
OR
select * from Mytable
where (Inputter != 'XYZ' or Authoriser != 'XYZ' or Audit != 'CHANGE' or History != 'CURRENT' )
输出:
Audit History Inputter Authoriser
Change before xyz xyz
Change CURRENT TOM TOM
ADD NEW TOM TOM
您有一个选择是执行以下操作。使用 CASE 语句过滤出 xyz 匹配特定条件的记录
select *
from Mytable a
where CASE WHEN a.Inputter=a.Authoriser AND a.Inputter='XYZ' AND a.Audit='CHANGE' AND a.History ='CURRENT'THEN
NULL
ELSE a.History
END = a.History
您可以使用 minus
设置运算符:
with t( CustNo, Audit, History, Inputter, Authoriser ) as
(
select 1,'CHANGE','CURRENT','XYZ','XYZ' union all
select 2,'CHANGE','BEFORE','XYZ','XYZ' union all
select 2,'CHANGE','CURRENT','TOM','TOM' union all
select 3,'ADD','NEW','TOM','TOM'
)
select * from t
minus
select *
from t
where Audit = 'CHANGE'
and History = 'CURRENT'
and Authoriser = 'XYZ';
CustNo Audit History Inputter Authoriser
------- ------ -------- -------- ----------
2 CHANGE BEFORE XYZ XYZ
2 CHANGE CURRENT TOM TOM
3 ADD NEW TOM TOM
或者可以使用 not in
:
select *
from t
where ( Audit, History, Authoriser ) not in
(
select Audit, History, Authoriser
from t
where Audit = 'CHANGE'
and History = 'CURRENT'
and Authoriser = 'XYZ' );
最简单的做法是使用 not
:
SELECT CustNo, Audit, History, Inputter, Authoriser
FROM MyTable
WHERE NOT (
Inputter = 'XYZ'
AND Authoriser = 'XYZ'
AND Audit = 'CHANGE'
AND History = 'CURRENT'
)
update:至于新需求,用not exists很容易搞定:
SELECT CustNo, Audit, History, Inputter, Authoriser
FROM MyTable t0
WHERE NOT EXISTS
(
SELECT 1
FROM MyTable t1
WHERE t1.CustNo = t0.CustNo
AND Inputter = 'XYZ'
AND Authoriser = 'XYZ'
AND Audit = 'CHANGE'
AND History = 'CURRENT'
)