我有一个Server表,其中包含9列,用于指示在UI的一部分中包含或排除哪些内容。每一列的值都可以是'A‘、'X’或空白。每一行在任何列中最多应有1 'A‘。
由于一个错误,许多列有多个'A‘值。如何编写返回打破此约束的每一行的查询?
我所拥有的只是:
SELECT PrimaryKey
FROM Criteria C
WHERE (C.First = 'A' AND C.Second = 'A')
OR (C.First = 'A' AND C.Third = 'A')
OR (C.First = 'A' AND C.Fourth = 'A')
...
OR (C.Eighth = 'A' AND C.Ninth = 'A')是否有任何更简洁或更优雅的方式来编写这些代码?
发布于 2020-03-16 15:57:19
您可以使用APPLY
SELECT C.*
FROM Criteria C CROSS APPLY
(SELECT COUNT(*) as num_a_s
FROM (VALUES (First), (Second), . . . -- list all the columns here
) V(x)
WHERE v.x = 'A'
) v
WHERE v.num_a_s >= 2;注意:如果将这些值存储在列中而不是单独的行中,则数据模型可能有问题。
发布于 2020-03-16 15:53:47
尝试以下几点:
select
* from YourTable
where REPLACE(TRIM('X' FROM col1),'A',1)
+ REPLACE(TRIM('X' FROM col2),'A',1)
+ REPLACE(TRIM('X' FROM col3),'A',1)
+ REPLACE(TRIM('X' FROM col4),'A',1)
+ REPLACE(TRIM('X' FROM col5),'A',1)
+ REPLACE(TRIM('X' FROM col6),'A',1)
+ REPLACE(TRIM('X' FROM col7),'A',1)
+ REPLACE(TRIM('X' FROM col8),'A',1)
+ REPLACE(TRIM('X' FROM col9),'A',1)> 1我也使用过TRIM,它需要Server 2017或更高版本。
或如下:
select *
from YourTable
where replace(replace(concat(col1,col2,col3,col4,col5,col6,col7,col8,col9), 'X', ''), 'A', 1) > 1请看演示。
发布于 2020-03-16 15:57:26
这里有一种方法
create table dbo.t1(x int, col1 varchar(10), col2 varchar(10))
insert into dbo.t1 values(1,'A','A')
insert into dbo.t1 values(2,'A','')
insert into dbo.t1 values(3,'','')
insert into dbo.t1 values(4,'','X')
select x
,count(case when n='A' then 1 end) as cnt
from dbo.t1
cross apply(values ('col1',col1)
,('col2',col2)
---repeat this for columns up to col9...
)x(m,n)
group by x
having count(case when n='A' then 1 end)>1https://stackoverflow.com/questions/60708808
复制相似问题