Tsql 其中字段1位于(空)
我希望根据两列从表中检索数据,其中一些列包含数据,另一些列包含NULL。在下面的第一个代码示例中,过程很好-返回所有行。在第二个示例中,没有返回行-因为NULL=NULL返回FALSE 第三个例子或多或少是我所想的,当列具有NULL值时,必须忽略此子句,并且仅使用前两列中的数据返回基于这两列的行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
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'中,