如果命中多个where子句,则返回同一行的多个副本的SQL查询

如果命中多个where子句,则返回同一行的多个副本的SQL查询,sql,sql-server,search,search-engine,record,Sql,Sql Server,Search,Search Engine,Record,根据多个where子句命中记录,我希望SQL为匹配的每个where子句返回被命中行的副本 c1 | c2 | c3 x y z x、 y,z:将仅返回一次,其中c1=x或c3=z 我想其中c1=x或c3=z返回x,y,z的两份副本 这能实现吗 为什么? 我试图消除运行多个查询来获得多个相同记录来进行优先级排序 如果我运行两个查询,一个用于c1,一个用于c3,我可以并且应该得到x,y,z的两个副本 我想要这两份x,y,z的设计,但我想运行一个查询。在我的实现中,我会遇到这样的情况:

根据多个where子句命中记录,我希望SQL为匹配的每个where子句返回被命中行的副本

c1 | c2 | c3

x    y    z
x、 y,z:将仅返回一次,其中c1=x或c3=z

我想
其中c1=x或c3=z
返回x,y,z的两份副本

这能实现吗

为什么?

我试图消除运行多个查询来获得多个相同记录来进行优先级排序

如果我运行两个查询,一个用于c1,一个用于c3,我可以并且应该得到x,y,z的两个副本

我想要这两份x,y,z的设计,但我想运行一个查询。在我的实现中,我会遇到这样的情况:我必须运行10次以上的查询行程才能得到我想要的。。。对于一个优先记录


我宁愿运行一个查询,而不是10个查询。

这样就可以了,尽管它可能没有您希望的那么优雅

SELECT c1,c2,c3 FROM [MyTableName] where c1=x 
UNION ALL 
SELECT c1,c2,c3 FROM [MyTableName] where c3=z 

已经回答了,但这里有一个替代方案:

SELECT  c1,c2,c3
FROM    [MyTableName]
        JOIN (VALUES (1),(2)) t(n) 
            ON (t.n = 1 AND c1 = 'x') OR (t.n = 2 AND c3 = 'z');

嗯,
UNION
是显而易见的答案,但这实际上只是在一个语句中执行多个查询的一种方式…@rbaryyoung,谢谢,甚至没有想到这一点。。。事实上,我对多个查询很在行,这是我不喜欢或不想要的多次往返。工会应该这么做。。。谢谢,汉克斯,让我来转一转。很有魅力。希望有一个查询,带有神奇的SQL选项。。。但工会是有效的。我不确定工会对绩效有什么影响。。。如果有人想在这个问题上添加任何内容,那么对于UNION对性能的影响,没有一个答案。在某些情况下,联合可能比使用非最优
where
子句的单个查询执行得更好。在其他情况下,它的表现可能更糟。
SELECT t.*
FROM MyTable t
CROSS APPLY (
  VALUES
  (c1,'x'),
  (c2,'y'),
  (c3,'z')
) f(col,val)
WHERE col = val