首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL确定给定行上是否有多个列具有相同的值。

SQL确定给定行上是否有多个列具有相同的值。
EN

Stack Overflow用户
提问于 2020-03-16 15:31:21
回答 4查看 388关注 0票数 2

我有一个Server表,其中包含9列,用于指示在UI的一部分中包含或排除哪些内容。每一列的值都可以是'A‘、'X’或空白。每一行在任何列中最多应有1 'A‘。

由于一个错误,许多列有多个'A‘值。如何编写返回打破此约束的每一行的查询?

我所拥有的只是:

代码语言:javascript
复制
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')

是否有任何更简洁或更优雅的方式来编写这些代码?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-03-16 15:57:19

您可以使用APPLY

代码语言:javascript
复制
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;

注意:如果将这些值存储在列中而不是单独的行中,则数据模型可能有问题。

票数 2
EN

Stack Overflow用户

发布于 2020-03-16 15:53:47

尝试以下几点:

代码语言:javascript
复制
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或更高版本。

或如下:

代码语言:javascript
复制
select *
from YourTable
where replace(replace(concat(col1,col2,col3,col4,col5,col6,col7,col8,col9), 'X', ''), 'A', 1) > 1

请看演示。

票数 0
EN

Stack Overflow用户

发布于 2020-03-16 15:57:26

这里有一种方法

代码语言:javascript
复制
  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)>1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60708808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档