【问题标题】:Get the value of END AS column in case when in where clause在 where 子句中获取 END AS 列的值
【发布时间】:2018-08-23 10:53:04
【问题描述】:

我有一个查询,我使用 case when to KNOWN_AS 列说明当它的 null 时然后“null”否则“not null”以 known_as2 结尾。现在在 where 子句中,我想引入仅包含 'Not null' 的行。

SELECT i.individual_ref, 0, 'KNOWNAS', i.FORENAMES, i.KNOWN_AS,
       case when KNOWN_AS is null then 'Null'  else ' Not null' end as known_as
FROM TestDatabase.dbo.INDIVIDUAL I
JOIN TestDatabase.dbo.MEMBER M ON M.INDIVIDUAL_REF=I.INDIVIDUAL_REF
WHERE  m.member_status IN(33,1316) 
  AND i.KNOWN_AS IS null or i.KNOWN_AS=''
  and m.MEMBER_STATUS in (33,1316)
  and LEN(i.FORENAMES) > '1' and i.FORENAMES !=''
  AND i.FORENAMES IS NOT NULL 

我需要帮助的原因是:-

我有一个包含 Forename、surname 和 known_as 字段的表。 我想获取 known_as 字段为空白/空且名字不为空或空白且名字长度为 >1 的成员。我怎样才能实现它。成员状态来自另一个表调用成员,我希望成员处于活动和待处理状态,因此我说 WHERE m.member_status IN (33,1316)。请有任何解决方案。

我终于用

解决了
 SELECT i.individual_ref,0,'KNOWNAS',
case when KNOWN_AS is null then 'Null'  else ' Not null' end as knownas2
FROM TestDatabase.dbo.INDIVIDUAL I
JOIN TestDatabase.dbo.MEMBER M ON M.INDIVIDUAL_REF=I.INDIVIDUAL_REF
       WHERE  m.member_status IN(33,1316) 
       and len(i.forenames)>2 and
          (IsNull(i.forenames, '') <> '') and (i.known_as is null or i.known_as='')

我不得不取 len(i.forenames, '')>2 而不是 1,因为有些成员的名字也被错误地更新为 Mr.

【问题讨论】:

  • 你有什么问题?
  • 我认为他想要的是他在案件中所做的 known_as,而不是原始字段
  • 派生表才是解决办法!
  • Logical processing order of the SELECT statement: "...这个顺序决定了在一个步骤中定义的对象何时可用于后续步骤中的子句.... 4. WHERE ... 8. SELECT"。不幸的是,SQL 的定义者犯了一个巨大的错误,让您以与逻辑处理顺序不同的顺序编写子句。修复它为时已晚:-(
  • @GordonLinoff 我需要帮助的原因是:- 我有一个包含 Forename、surname 和 known_as 字段的表。我想获取 known_as 字段为空白/空且名字不为空或空白且名字长度为 >1 的成员。我怎样才能实现它。成员状态来自另一个表调用成员,我希望成员处于活动和待处理状态,因此我说 WHERE m.member_status IN (33,1316)。请提供任何解决方案。

标签: sql sql-server tsql


【解决方案1】:

现在在 where 子句中,我想引入仅包含 'Not null' 的行。

只需将 WHERE 子句修改为 IS NOT NULL 为:

SELECT i.individual_ref, 0, 'KNOWNAS', i.FORENAMES, i.KNOWN_AS
FROM DiTestDatabase.dbo.INDIVIDUAL I JOIN 
     DiTestDatabase.dbo.MEMBER M 
     ON M.INDIVIDUAL_REF = I.INDIVIDUAL_REF
WHERE m.member_status IN (33,1316) AND
      LEN(i.FORENAMES) > 1 AND i.FORENAMES != '' AND 
      i.FORENAMES IS NOT NULL AND i.KNOWN_AS IS NOT NULL;

注意:

  • LEN() 将返回 INT 类型。所以,你不需要使用''

【讨论】:

  • 通过您的查询,我得到我的“Known_as”不是空的和空白的。我希望我的 known_as 列为 null 或空白。
  • 我需要帮助的原因是:- 我有一个包含 Forename、surname 和 known_as 字段的表。我想获取 known_as 字段为空白/空且名字不为空或空白且名字长度为 >1 的成员。我怎样才能实现它。成员状态来自另一个表调用成员,我希望成员处于活动和待处理状态,因此我说 WHERE m.member_status IN (33,1316)。请提供任何解决方案。
【解决方案2】:

下面的查询可能会对你有所帮助。

SELECT i.individual_ref, 0, 'KNOWNAS', i.FORENAMES, i.KNOWN_AS
,CASE WHEN i.KNOWN_AS IS NULL THEN 'null'
      ELSE 'Not null' END AS KNOWN_AS2
FROM DiTestDatabase.dbo.INDIVIDUAL I JOIN 
     DiTestDatabase.dbo.MEMBER M 
     ON M.INDIVIDUAL_REF = I.INDIVIDUAL_REF
WHERE m.member_status IN (33,1316) AND
      LEN(i.FORENAMES) > 1 AND i.FORENAMES != '' AND 
      i.FORENAMES IS NOT NULL AND i.KNOWN_AS IS NOT NULL;

【讨论】:

  • 通过您的查询,我得到我的“Known_as”不是空的和空白的。我希望我的 known_as 列为 null 或空白。
  • 只需更改 where 条件,如 ISNULL(i.KNOWN_AS,'')=''。然后你会得到 KNOWN_AS 值变为空或空白。可能这会对你有所帮助。
【解决方案3】:

这样我们可以得到解决方案

SELECT * FROM ( SELECT i.individual_ref, 0, 'KNOWNAS', i.FORENAMES, i.KNOWN_AS, case when KNOWN_AS is null then 'Null' else 'Not null' end as known_as FROM DiTestDatabase.dbo.INDIVIDUAL I JOIN DiTestDatabase.dbo.MEMBER M ON M.INDIVIDUAL_REF=I.INDIVIDUAL_REF WHERE m.member_status IN(33,1316) AND i.KNOWN_AS IS null or i.KNOWN_AS='' and m.MEMBER_STATUS in (33,1316) and LEN(i.FORENAMES) > 1 and i.FORENAMES !='' AND i.FORENAMES IS NOT NULL) t WHERE t.known_as='Not null'

【讨论】:

  • 我收到一个错误“关键字 'WHERE' 附近的语法不正确。”
  • 检查您的查询是否正在运行,我只是添加一个父查询,例如 select * from(your query) where columnname='not null'
  • 消息 8155,级别 16,状态 2,第 48 行没有为“tab1”的第 2 列指定列名。消息 8155,级别 16,状态 2,第 48 行没有为“tab1”的第 3 列指定列名。消息 8156,级别 16,状态 1,第 48 行 为“tab1”多次指定了“known_as”列。我收到此错误
  • 我已经删除了那些我得到错误的列,现在它没有给我任何价值。
  • 这个错误是因为没有提到列名和两个相同的列名,所以我修改了列名。你可以根据你的修改。让我们检查更新的查询
猜你喜欢
  • 1970-01-01
  • 2015-08-17
  • 2018-05-31
  • 2023-03-08
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多