0

我有一列(数据类型nvarchar(max),不是我的选择,遗留),对最终用户有各种不同的用途,具体取决于其他因素。

我试图缩小到该列中的某些特定数据,因为在一些样本(但具有高度代表性)数据中给出了前面的条款我注意到剩余的数据是 1、2、3、4 或日期

我最初添加了一些嵌套NULLIF以及IS NOT NULL

AND NULLIF(NULLIF(NULLIF(NULLIF([ColumnName],'1'),'2'),'3'),'4') IS NOT NULL

1 作为字符串,因为在全局数据中有一些字符串,因此删除单括号会创建隐含转换为 int 的许多记录会失败。这使我的样本中的记录减少到 25 条,带有日期的记录和目标记录

然后我想我会添加一个ISDATE来隔离这些记录

AND NULLIF(NULLIF(NULLIF(NULLIF(ISDATE([ColumnName]),'1'),'2'),'3'),'4') IS NOT NULL

然后返回 60k 左右的记录,这不是我预期的行为。

我运行了以下查询以查看这两个内联命令是否不兼容,但按预期返回

SELECT NULLIF(ISDATE('06/01/2022'),1)

返回NULL

SELECT NULLIF(ISDATE('06/01/2022'),'1')

以防它不喜欢字符串,但返回NULL.

SELECT NULLIF(NULLIF(ISDATE('06/01/2022'),'1'),'2')

以防它不喜欢巢,但返回NULL

那么,为什么它不 NULL 表示日期的值,以及为什么它否定嵌套外部的其他 NULLIF 命令?

4

1 回答 1

0

原来我是个白痴

我忘了捕捉ISDATE()返回 0 的所有时间,所以它返回了NULLIFs 试图捕捉的所有值

AND ISDATE(ISNULL(NULLIF(NULLIF(NULLIF(NULLIF([2nd Ref],'1'),'2'),'3'),'4'),'06/01/2022')) = 0

因此,在这里更改顺序会有所帮助,NULL为预期值创建 s,将它们更改为已知日期,然后返回不是日期的地方

现在应该可以按预期工作了。哦,好吧,有一天有人可能会发现它很有用

编辑:有几条记录仍然有日期,我也会TRYCONVERT按照 Jeroen 的建议使用

于 2022-03-03T18:00:52.443 回答