我有一个是在一定的标准结合在一起的两列,但我也想检查两个看看其他两列是相同的,然后再返回位字段,如果他们。
是否有一个比使用CASE WHEN简单的解决方案?
理想情况下我可以只使用:
SELECT Column1 = Column2 AS MyDesiredResult
FROM Table1
INNER JOIN Table2 ON Table1.PrimaryKey = Table2.ForeignKey
我有一个是在一定的标准结合在一起的两列,但我也想检查两个看看其他两列是相同的,然后再返回位字段,如果他们。
是否有一个比使用CASE WHEN简单的解决方案?
理想情况下我可以只使用:
SELECT Column1 = Column2 AS MyDesiredResult
FROM Table1
INNER JOIN Table2 ON Table1.PrimaryKey = Table2.ForeignKey
出了什么问题案例呢? 为了看到结果,你需要至少一个字节,这是你与单个字符得到什么。
CASE WHEN COLUMN1 = COLUMN2 THEN '1' ELSE '0' END AS MyDesiredResult
应该正常工作,并为所有意图和目的,完成同样的事情,使用位字段。
我会与去CASE WHEN
也。
根据你真正想做的事,可能还有其他的选择,虽然,像使用一个外部联接或什么,但似乎并没有被你在这种情况下所需要的。
的溶液避免CASE WHEN
是使用COALESCE
。
SELECT
t1.Col2 AS t1Col2,
t2.Col2 AS t2Col2,
COALESCE(NULLIF(t1.Col2, t2.Col2),NULLIF(t2.Col2, t1.Col2)) as NULL_IF_SAME
FROM @t1 AS t1
JOIN @t2 AS t2 ON t1.ColID = t2.ColID
NULL_IF_SAME
柱会给NULL
所有行,其中t1.col2 = t2.col2
(包括NULL
)。 虽然这是不超过可读CASE WHEN
表达式,它是ANSI SQL。
只是为了好玩起见,如果一个人想拥有的0和1的布尔位值(虽然不是很可读,因此不推荐),可以使用(它为所有的数据类型作品):
1/ISNULL(LEN(COALESCE(NULLIF(t1.Col2, t2.Col2),NULLIF(t2.Col2, t1.Col2)))+2,1) as BOOL_BIT_SAME.
现在,如果你有数字数据类型之一,并希望位,在上述LEN
函数转换为字符串第一个可能是有问题的,所以不是这应该工作:
1/(CAST(ISNULL(ABS(COALESCE(NULLIF(t1.Col2, t2.Col2),NULLIF(t2.Col2, t1.Col2)))+1,0)as bit)+1) as FAST_BOOL_BIT_SAME_NUMERIC
上面会为整数的工作没有CAST
。
注:另外,在SQLServer的2012年,我们有IIF
功能。
CASE WHEN是更好的选择
SELECT
CASE WHEN COLUMN1 = COLUMN2
THEN '1'
ELSE '0'
END
AS MyDesiredResult
FROM Table1
INNER JOIN Table2 ON Table1.PrimaryKey = Table2.ForeignKey
关于大卫·埃利桑多的答案,这可能产生假阳性。 它也不会放弃零当值不匹配。
DECLARE @t1 TABLE (
ColID int IDENTITY,
Col2 int
)
DECLARE @t2 TABLE (
ColID int IDENTITY,
Col2 int
)
INSERT INTO @t1 (Col2) VALUES (123)
INSERT INTO @t1 (Col2) VALUES (234)
INSERT INTO @t1 (Col2) VALUES (456)
INSERT INTO @t1 (Col2) VALUES (1)
INSERT INTO @t2 (Col2) VALUES (123)
INSERT INTO @t2 (Col2) VALUES (345)
INSERT INTO @t2 (Col2) VALUES (456)
INSERT INTO @t2 (Col2) VALUES (2)
SELECT
t1.Col2 AS t1Col2,
t2.Col2 AS t2Col2,
ISNULL(NULLIF(t1.Col2, t2.Col2), 1) AS MyDesiredResult
FROM @t1 AS t1
JOIN @t2 AS t2 ON t1.ColID = t2.ColID
t1Col2 t2Col2 MyDesiredResult
----------- ----------- ---------------
123 123 1
234 345 234 <- Not a zero
456 456 1
1 2 1 <- Not a match
我能想到的最接近的NULLIF:
SELECT
ISNULL(NULLIF(O.ShipName, C.CompanyName), 1),
O.ShipName,
C.CompanyName,
O.OrderId
FROM [Northwind].[dbo].[Orders] O
INNER JOIN [Northwind].[dbo].[Customers] C
ON C.CustomerId = O.CustomerId
GO
如果两个表达式不相等 NULLIF返回第一个表达式。 如果表达式相等,NULLIF返回第一个表达式的类型的一个空值。
所以,上面的查询将返回1,其中该列是相等的, 所述第一表达否则记录。