请原谅格式化,这是我的第一篇帖子.

我有一张如下表:

id code Fig
1 AAA MB010@2-1-2-5A@2-2-3
2 AAB MB010@2-3-4-2@2-2A-2-4
3 AABA NULL
4 AAC MB020@2-5-3A

我的代码如下:

  SELECT 
     source.id
    ,source.code
    ,codePub = LEFT(source.Fig,5)
    ,f.value AS [FigRef]
  FROM [dbo].[sourceData] AS source
  OUTER APPLY STRING_SPLIT(source.[Fig], '@') as f
  WHERE f.value NOT LIKE 'MB%'

这给了我下表:

id code codePub FigRef
1 AAA MB010 2-1-2-5A
1 AAA MB010 2-2-3
2 AAB MB010 2-3-4-2
2 AAB MB010 2-2A-2-4
4 AAC MB020 2-5-3A

但我也希望代码具有空值,如下所示:

id code codePub FigRef
1 AAA MB010 2-1-2-5A
1 AAA MB010 2-2-3
2 AAB MB010 2-3-4-2
2 AAB MB010 2-2A-2-4
3 AABA NULL NULL
4 AAC MB020 2-5-3A

如何保持Fig值为空的代码?

推荐答案

你的WHERE子句过滤掉空值.

NULL LIKE 'MB%'是"未知",在WHERE子句的上下文中不是"true",因此这些行被过滤掉.

NULL NOT LIKE 'MB%'仍然是"未知",在WHERE子句的上下文中仍然不是"true",因此这些行也会被过滤掉.

NULL = NULL表示"未知",NULL IS NULL表示"真实".

Comparison Operators

比较运算符测试两个表达式是否相同.

比较运算符的结果具有布尔数据类型.这

启用SET ANSI\u NULLS时,具有一个或两个NULL表达式的运算符将返回UNKNOWN.

您需要使用IS运算符显式比较NULL.例如,如下所示:

  SELECT 
     source.id
    ,source.code
    ,codePub = LEFT(source.Fig,5)
    ,f.value AS [FigRef]
  FROM 
      [dbo].[sourceData] AS source
      OUTER APPLY STRING_SPLIT(source.[Fig], '@') as f
  WHERE 
      f.value NOT LIKE 'MB%' OR f.value IS NULL

Sql相关问答推荐

优化SQL查询流

在SQL中向每个子字节组添加字节行

如何在一个范围内进行分组.""范围值在范围表中定义

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

通过 Select 值的顺序进行排序ClickHouse

R中对Arrow duckdb工作流的SQL查询

使用占位符向SQL INSERT查询添加 case

在Oracle SQL中将列值转换为行

对表进行多项 Select 以返回最大值和时间

在SQL中为两个日期之间的每个日期添加行

在 PostgreSQL 中生成时间序列查询

根据具有特定值的 ID 创建自定义组

在 Oracle 21c 中透视文本值

没有调用子查询的嵌套 JOIN语法是什么?

如何从一张表中获取值在至少三行相同的记录

查询中获取审批者不起作用

每个ID的SQL返回可能的最低级别及其值

使用给定的变量对在循环中执行更新语句

我现在如何显示重复的汽车? postgresql

如何根据 ID 和指标从 2 个表中找到不同的值?