使用通配符和强制子句

时间:2017-07-07 11:18:57

标签: sql-server tsql join sql-server-2012 boolean-logic

我有两个表,TableA和TableB必须以这种方式加入

  • ColumnA必须匹配
  • ColumnB和ColumnC可以匹配(如果不是那么应该被视为通配符)

我在下面写了这个

的查询
SELECT *
FROM TableA  JOIN TableB ON (TableA.ColumnA = TableB.ColumnA) AND
(TableA.ColumnB = TableB.ColumnB OR TableA.ColumnC = TableB.ColumnC)

总之,如果ColumnB(来自TableB)为NULL,则ColumnA应与ColumnA匹配,然后将其视为通配符,如果ColumnC(From TableB)为NULL,则将其视为通配符。

现在,我怀疑这不会产生正确的结果,因为按照布尔数学

enter image description here

哪个

  

真与假=假

我在寻找什么

True AND (True OR False) = True
True AND (True OR True) = True
True AND (False OR True) = True
False AND (True OR True) = False
False AND (True or False) = False
False AND (False OR True) = False
False AND (False OR False) = False

{这只是大型查询的一部分,所以我不是要分享完整的例子,我很抱歉}

1 个答案:

答案 0 :(得分:2)

看看你的逻辑,B列和C列真的只是红色的鲱鱼,你可以放心地忽略它们。所以你的查询要简单得多:

SELECT *
FROM TableA  
JOIN TableB 
    ON TableA.ColumnA = TableB.ColumnA

此外,您可能希望列指示B或C也匹配,因此您可以执行此操作:

SELECT *,
       CASE 
           WHEN TableA.ColumnB = TableB.ColumnB OR TableA.ColumnC = TableB.ColumnC 
               THEN 0
               ELSE 1 END 
           AS IsWildcard
FROM TableA  
JOIN TableB 
    ON TableA.ColumnA = TableB.ColumnA