Sql 使用多列筛选记录

Sql 使用多列筛选记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,表中有4个属性。一次只能将一个属性设置为Y。是否有SQL Server函数来查找此项 您可以在此处使用连接技巧: 挑选* 从你的桌子上 其中Attribute1+Attribute2+Attribute3+Attribute4 不像“%Y%Y%”; 但这也将匹配所有4个属性均为N的记录。如果您还希望坚持一个Y,但不超过一个Y,则使用以下版本: 挑选* 从你的桌子上 哪里 Attribute1+Attribute2+Attribute3+Attribute4,如“%Y%”和 属性1+Attribu

表中有4个属性。一次只能将一个属性设置为Y。是否有SQL Server函数来查找此项


您可以在此处使用连接技巧:

挑选* 从你的桌子上 其中Attribute1+Attribute2+Attribute3+Attribute4 不像“%Y%Y%”; 但这也将匹配所有4个属性均为N的记录。如果您还希望坚持一个Y,但不超过一个Y,则使用以下版本:

挑选* 从你的桌子上 哪里 Attribute1+Attribute2+Attribute3+Attribute4,如“%Y%”和 属性1+Attribute2+Attribute3+Attribute4 不像“%Y%Y%”;
如果您只想将记录标识为有效或无效,则可以执行以下操作:

如果对象_ID'tempdb..Sample',则'U'不是空的DROP TABLE Sample-从样本中选择* 创建表格示例 Attribute1 char1不为空, Attribute2 char1不为空, Attribute3 char1不为空, 属性4 char1不为空 插入样本属性1、属性2、属性3、属性4 值'Y','N','N','N' “N”,“Y”,“N”,“N” “N”,“N”,“Y”,“N” ,'N','N','N','Y' “N”,“N”,“Y”,“Y” 挑选* ,IsValid=IIFLENREPLACECONCATs.Attribute1,s.Attribute2,s.Attribute3,s.Attribute4,'Y',>=3,'Valid','Invalid' 从样本s 返回:

| Attribute1 | Attribute2 | Attribute3 | Attribute4 | IsValid | 
|------------|------------|------------|------------|---------| 
| Y          | N          | N          | N          | Valid   | 
| N          | Y          | N          | N          | Valid   | 
| N          | N          | Y          | N          | Valid   | 
| N          | N          | N          | Y          | Valid   | 
| N          | N          | Y          | Y          | Invalid | 
逻辑是……把4列合并成一个字符串,这样Y,N,N,N就变成了YNNN。然后替换字母“Y”的所有实例并获得结果的长度。因为你知道原来的长度是4,现在你知道有多少Y被删除了

这是计算一个字符串在另一个字符串中出现的次数的经典技巧

在我的示例中,我将零或一个Y视为有效。

尝试以下方法:

DECLARE @Attr TABLE(A1 CHAR,
A2 CHAR,
A3 CHAR,
A4 CHAR)

insert Into @Attr  VALUES('Y','N','N','N')
insert Into @Attr  VALUES('N','Y','N','N')
insert Into @Attr  VALUES('N','N','Y','N')
insert Into @Attr  VALUES('N','N','N','Y')
insert Into @Attr  VALUES('Y','N','Y','N')

SELECT * FROm @Attr

SELECT * FROM @Attr
WHERE 
((A2<>'Y' AND A3<>'Y' AND A4<>'Y' ) OR 
(A1<>'Y' AND A3<>'Y' AND A4<>'Y') OR 
(A1<>'Y' AND A2<>'Y' AND A4<>'Y') OR
(A1<>'Y' AND A2<>'Y' AND A3<>'Y'))

可以使用以下布尔表达式限制属性中最多一个Y值:

IIFAttribute1='Y',1,0+ IIFAttribute2='Y',1,0+ IIFAttribute3='Y',1,0+ IIFAttribute4='Y',1,0在一个select查询中,这似乎足以满足您的需要,那么我建议:

select t.*
from t cross apply
     (select count(*) as num_ys
      from (values (attribute1), (attribute2), (attribute3), (attribute4)
           ) v(attr)
      where attr = 1
     ) v
where num_ys = 1;

在这种情况下,apply的性能实际上相当好。更重要的是,这使得泛化查询变得更加简单—添加新属性,或至少说一个Y,但不超过2个Ns或其他任何内容。

是否要标识包含多个集合的记录?或者只想输出只有1组的有效记录?请选中此项。对于一个类似的问题,有两种解决方案。我想获得具有多个属性设置为Y的记录列表。@sivabalanarayanan。令人惊讶的是,我们两人恰好同时在看这个长达数小时的问题。@GordonLinoff当我将条件改为>1时,它就起作用了。人们本可以忽略这一点。我接受了,因为我正在考虑案件陈述,IFF是案件的一种速记方式。