SQL Server:是否有一个函数来确定所有指定的值是否相等?

时间:2017-09-20 07:10:38

标签: sql-server where

我正在寻找像这样的“ALL_EQUAL”函数:

SELECT *
FROM Table1
INNER JOIN Table2 ON Table2.Field = Table1.Field
INNER JOIN Table3.Field = Table1.Field 
WHERE ALL_EQUAL(Table1.Value, Table2.Value, Table3.Value)

我当然可以通过创建一个巨大的“AND”链来实现这一目标。但是在我想要执行此查询的环境中,我必须比较多达7个值,因此一个AND链将是庞大的(目前重组表不是一个选项)。

有没有优雅的方法来做到这一点?

2 个答案:

答案 0 :(得分:0)

您可以构建自定义表达式,但它不会简化这些事情。例如:

DECLARE @Value1 TINYINT = 5
       ,@Value2 TINYINT = 5
       ,@Value3 TINYINT = 5
       ,@Value4 TINYINT = 3;

SELECT IIF(CONCAT(@Value1, @Value2, @Value3, @Value4) = REPLICATE(@Value1, 4), 1, 0)

GO

DECLARE @Value1 TINYINT = 5
       ,@Value2 TINYINT = 5
       ,@Value3 TINYINT = 5
       ,@Value4 TINYINT = 5;

SELECT IIF(CONCAT(@Value1, @Value2, @Value3, @Value4) = REPLICATE(@Value1, 4), 1, 0)

GO


DECLARE @Value1 TINYINT = 5
       ,@Value2 TINYINT = NULL
       ,@Value3 TINYINT = 5
       ,@Value4 TINYINT = 5;

SELECT IIF(CONCAT(@Value1, @Value2, @Value3, @Value4) = REPLICATE(@Value1, 4), 1, 0)

GO



DECLARE @Value1 VARCHAR(8) = 5
       ,@Value2 TINYINT = 5
       ,@Value3 TINYINT = 5
       ,@Value4 TINYINT = 5;

SELECT IIF(CONCAT(@Value1, @Value2, @Value3, @Value4) = REPLICATE(@Value1, 4), 1, 0)

GO

在这里你可以试试:

AND

这可能会减少一点长度,但您必须使用const getters = { project: state => { return id => { // note this passes the id from the component return state.fram && state.fram.projects // in case async not done yet ? state.fram.projects.find(item => item.id === id) : null } } } 测试它与标准解决方案相比如何影响性能。

答案 1 :(得分:0)

如果您想使用1个表达式,可以尝试以下方法。但我不认为它比使用单独的比较更好(Value1 = Value2 AND Value1 = Value3 AND Value1 = Value4 ...)。如果你有7个值,则进行6次比较。

SELECT *
FROM Table1
INNER JOIN Table2 ON Table2.Field = Table1.Field
INNER JOIN Table3.Field = Table1.Field 
WHERE Table1.Value = ALL(
      SELECT Table2.Value UNION ALL
      SELECT Table3.Value)