【问题标题】:CASE expression with LEFT function带有 LEFT 函数的 CASE 表达式
【发布时间】:2019-09-25 19:57:52
【问题描述】:

编辑 视图如下所示

CREATE VIEW [dbo].[vw] AS
SELECT 
    d.Column1
    ,d.Column2
    ,d.DocumentNo
    ,d.Title AS 'abc'
    ,d.column3 AS 'def'
    ,d.column4
    ,d.column5 AS 'adad'
    ,d.CODE
    ,d.ARCHIVED
    ,d.Revised
    ,d.Received
    ,d.APPROVED
    ,d.Act
    ,d.Cat
    ,d.Column8
    ,d.Column9
    ,d.[req]
    , CASE WHEN p.ProjNo = '12345' and d.DocumentNo = LEFT(d.DocumentNo,8)) = 12345678 THEN p.ProjNo = 12345678 and p.ProjTitle = 'title1' 
      ELSE CASE WHEN p.ProjNo = '12345' and (d.DocumentNo = LEFT(d.DocumentNo,8)) = 23456789 THEN p.ProjNo = 23456789 and p.ProjTitle = 'Title2' 
      ELSE CASE WHEN p.projNo = '12345' and (d.DocumentNo = LEFT(d.DocumentNo,8)) = 34567890 THEN p.projNo = `34567890` and p.projTitile = 'Title3' 
      ELSE p.ProjNo END AS [BTProjNo] 
    ,p.ID

FROM [DB].[dbo].[Document] d
    INNER JOIN [DB].[dbo].[Project] p ON d.ProjNo = p.ProjNo

由于新的公司标准,我正在尝试对已编写的文件进行更改。在数据库中有一个 projNo 列,DocumentNo 列。现在公司将一个项目拆分为3个小项目,项目编号为DocumentNo的前8个字符。

尝试:我尝试使用 CASE 表达式和 LEFT 函数来拆分 DocumentNo 并使其成为新的 projNo。但我不断收到错误。我试过带/不带括号是一样的

代码:

CASE WHEN p.ProjNo = '12345' and d.DocumentNo = LEFT(d.DocumentNo,8)) = 12345678 THEN p.ProjNo = 
         12345678 and p.ProjTitle = ' ' 
  ELSE CASE WHEN p.ProjNo = '12345' and (d.DocumentNo = LEFT(d.DocumentNo,8)) = 23456789 THEN 
           p.ProjNo = 23456789 and p.ProjTitle = ' ' 
  ELSE CASE WHEN p.projNo = '12345' and (d.DocumentNo = LEFT(d.DocumentNo,8)) = 34567890 THEN 
           p.projNo = `34567890` and p.projTitile = ' ' 
  ELSE p.ProjNo END AS [BTProjNo]

错误:

1) 在需要条件的地方指定非布尔类型的表达式 - 显示在 d.DocumentNo 的值处
2) 所有 3 ELSE 附近的语法不正确。期待 AND,OR,THEN
3) 所有 3 '=' 附近的语法不正确,期望 AND、OR、THEN

谁能告诉我我做错了什么并帮助我朝着正确的方向前进?

【问题讨论】:

  • 当你有一个 CASE WHEN A = B = C 时你想做什么?那是无效的语法,我不明白你认为它应该做什么。
  • 您的代码充满了语法错误。发布示例数据和预期结果并说明您想要做什么。
  • @avery 我正在尝试更改视图。目前它具有 p.projNo、d.DocumentNo 和所有连接。我正在尝试对 p.ProjNo 列使用 CASE 语句来包含 3 个新的 p.projNo。 3 个新的 p.projNo 是 d.DocumentNo .. 中的前 8 个字符。希望这很清楚吗?我是新手,现在正在吸吮它..
  • 您需要发布现有视图,或者至少发布足够多的视图,以便我们可以看到您要修改的内容。
  • 我仍然认为我的回答符合您的描述。它要么需要替换 select 中的 p.ProjNo,要么可能需要添加到子查询甚至连接子句中。

标签: sql sql-server case


【解决方案1】:

仍在尝试了解当前有效的内容(如果有的话),以便我们了解如何修复无效的内容。但我会尝试其他方法:

CREATE VIEW [dbo].[vw] AS
SELECT 
    d.Column1
    ,d.Column2
    ,d.DocumentNo
    ,d.Title AS 'abc'
    ,d.column3 AS 'def'
    ,d.column4
    ,d.column5 AS 'adad'
    ,d.CODE
    ,d.ARCHIVED
    ,d.Revised
    ,d.Received
    ,d.APPROVED
    ,d.Act
    ,d.Cat
    ,d.Column8
    ,d.Column9
    ,d.[req]
    , CASE WHEN p.ProjNo = '12345' and LEFT(d.DocumentNo,8)) = 12345678 THEN 12345678
           WHEN p.ProjNo = '12345' and LEFT(d.DocumentNo,8)) = 23456789 THEN 23456789
           WHEN p.projNo = '12345' and LEFT(d.DocumentNo,8)) = 34567890 THEN 34567890
           ELSE p.ProjNo END AS [BTProjNo]
    , CASE WHEN p.ProjNo = '12345' and LEFT(d.DocumentNo,8)) = 12345678 THEN 'title1'
           WHEN p.ProjNo = '12345' and LEFT(d.DocumentNo,8)) = 23456789 THEN 'title2'
           WHEN p.projNo = '12345' and LEFT(d.DocumentNo,8)) = 34567890 THEN 'title3'
           ELSE p.ProjTitle END AS ProjTitle
    ,p.ID

FROM [DB].[dbo].[Document] d
    INNER JOIN [DB].[dbo].[Project] p ON d.ProjNo = p.ProjNo

【讨论】:

    【解决方案2】:

    也许是这样的:

    CASE WHEN p.ProjNo = '12345' THEN LEFT(d.DocumentNo,8)) else p.ProjNo end AS ProjNo
    

    这就是您使用 ProjNo 的方式,除非 ProjNo 是“12345”,那么在这种情况下,您将替换 DocumentNo 的前 8 个。您可以在您的 select 语句和/或 join 语句中使用它。

    如果 ProjTitle 也受到影响,则为它添加一个 单独的 case 语句:

    CASE WHEN p.ProjNo = '12345' THEN ' ' ELSE p.ProjTitle end AS ProjTitle
    

    【讨论】:

    • 这不起作用,因为“12345”被分成 3 个婴儿项目,每个项目都有不同的 projNo 和 projTitle
    【解决方案3】:

    所以您在更新语句中使用了 CASE,对吗?

           SELECT
                CASE WHEN p.ProjNo = '12345' and LEFT(d.DocumentNo,8) IN(12345678,23456789, 34567890) THEN LEFT(d.DocumentNo,8) ELSE p.ProjNo END AS ProjNo ,
               CASE WHEN p.ProjNo = '12345' and LEFT(d.DocumentNo,8) IN(12345678,23456789, 34567890) THEN N'' ELSE p.projTitile END AS projTitile
        FROM yourtable p
    INNER JOIN document d
    ON ...
    

    【讨论】:

    • 我正在尝试更改视图中的代码。所以之前有一个 p.projNo 列。我正在尝试在该列中使用 CASE 语句..
    • 如果在视图中,则为SELECT语句。更新
    • 我仍然收到错误 - “在预期条件的地方指定了非布尔类型的表达式” - 在 LEFT(d.DocumentNo,8))
    • 我有多余的括号。删除
    【解决方案4】:

    只是在这里猜测-似乎仍然有些不清楚-这个 8 位数的文档编号也是项目编号(即也是 8 位数),所以也许您需要更改连接条件...

    INNER JOIN [DB].[dbo].[Project] p 
    ON ( 
           (d.ProjNo = p.ProjNo) 
           OR 
           (len(d.DocumentNumber) = 8 AND d.DocumentNo = p.ProjNo)
       )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多