Tsql 其中字段1位于(空)

Tsql 其中字段1位于(空),tsql,null,where-in,Tsql,Null,Where In,我希望根据两列从表中检索数据,其中一些列包含数据,另一些列包含NULL。在下面的第一个代码示例中,过程很好-返回所有行。在第二个示例中,没有返回行-因为NULL=NULL返回FALSE 第三个例子或多或少是我所想的,当列具有NULL值时,必须忽略此子句,并且仅使用前两列中的数据返回基于这两列的行 SELECT * FROM XYZ WHERE col1 IN ('a', 'b') AND col2 IN ('c', 'd') AND col3 IN ('e', 'f') SELECT * F

我希望根据两列从表中检索数据,其中一些列包含数据,另一些列包含NULL。在下面的第一个代码示例中,过程很好-返回所有行。在第二个示例中,没有返回行-因为NULL=NULL返回FALSE

第三个例子或多或少是我所想的,当列具有NULL值时,必须忽略此子句,并且仅使用前两列中的数据返回基于这两列的行

SELECT * FROM XYZ
WHERE col1 IN ('a', 'b')
AND col2 IN ('c', 'd')
AND col3 IN ('e', 'f')


SELECT * FROM XYZ
WHERE col1 IN ('a', 'b')
AND col2 IN ('c', 'd')
AND col3 IN (NULL) --???


SELECT * FROM XYZ
WHERE col1 IN ('a', 'b')
AND col2 IN ('c', 'd')
--AND col3 IN (NULL) --IGNORED
目前我使用动态SQL语句,但速度非常慢

SET @EventCodeList = 
(SELECT REPLACE(tEventCode, ' ', '') FROM tblActivityPerCC_Config WHERE tCostCenter = @CostCenter) 


SET @EventCodeStr = 
CASE WHEN @EventCodeList IS NULL THEN ' logs.tEventCode LIKE (''%'') '
ELSE ' logs.tEventCode IN (SELECT qValue FROM nsEMV.dbo.fncReturnCommaDelimitedStringAsTable(@EventCodeList))'
END

SET @SQLString = N'  
SELECT
    ccg.Field1,
    logs.Field2     
FROM dbo.tblEMV_Logsheet AS logs 
INNER JOIN dbo.tblLookup_EMVEquipment AS ccg ON logs.tEquipmentKey = ccg.tEquipmentKey
WHERE tDate BETWEEN ''' + CONVERT(varchar(30), @BMonth) + ''' AND ''' + CONVERT(varchar(30), @EMonth) + ''' 
AND  logs.tAreaCode IN ('XYZ', 'ABC') 
AND ' + @EventCodeStr + ' --THE FOLLOWING COLUMNS MAY HAVE NULL VALUES
AND ' + @SourceStr + '
AND ' + @DestinationStr'
任何帮助都将不胜感激

针对Jayvee的以下建议: 这不符合我的初衷,否则我就做错了

CREATE TABLE #temp
(
value varchar(10),
value2 varchar(10)
)

INSERT INTO #temp (value, value2) SELECT '5', '3'
INSERT INTO #temp (value, value2) SELECT NULL, '2'
INSERT INTO #temp (value, value2) SELECT '4', NULL
INSERT INTO #temp (value, value2) SELECT '6', '2'
INSERT INTO #temp (value, value2) SELECT '6', NULL
INSERT INTO #temp (value, value2) SELECT '6', '4'
INSERT INTO #temp (value, value2) SELECT NULL, '1'
INSERT INTO #temp (value, value2) SELECT NULL, '4'

SELECT value as [value],value2 as [value2]  FROM #temp
WHERE ISNULL(value,'') IN ('4')
AND ISNULL(value2,'') IN ('4')

DROP TABLE #temp
Try是空的

从XYZ中选择* col1在'a','b'中的位置 和col2在'c','d' col3是NULL,而不是NULL
像这样的方法应该会奏效:

SELECT * FROM XYZ
WHERE ISNULL(col1,'') IN ('a', 'b','')
AND   ISNULL(col2,'') IN ('c', 'd','')
AND   ISNULL(col3,'') IN ('')

对于每一列,根据您的参数测试它,并包括IS NULL测试,将它们与括号结合起来,如下所示:

SELECT
      *
FROM XYZ
WHERE (col1 IN ('a', 'b') OR col1 IS NULL)
  AND (col2 IN ('c', 'd') OR col2 IS NULL) 
  AND (col3 IN (NULL) OR col3 IS NULL)

此处,NULL中的col3用于演示未提供的参数

三列中的任何一列都可以有NULL值。看一下最后一段代码的最后三行,这三个变量中的任何一个都可以是空的,这三个变量都是被删除的字符串,最好能解释一下为什么会这样做。@Plasmah isnull函数将null值计算为第二个参数中的值,在本例中为空字符串。与计算结果为false的null=null相反,=计算结果为true。@Jayvee,我已经尝试了代码,但不起作用。请参阅我上面编辑的问题-可能我做错了什么。您需要将作为另一个包含在值中:其中ISNULLvalue位于'4'中,ISNULLvalue2位于'4'中,