Sql 带左函数的CASE表达式

Sql 带左函数的CASE表达式,sql,sql-server,case,Sql,Sql Server,Case,编辑视图如下所示 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

编辑视图如下所示

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个小项目,其中ProjNo是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) 所有3'='附近的语法不正确,应为AND,OR,然后


有谁能告诉我我做错了什么并帮我找到正确的方向吗?

那么你在更新语句中使用了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 ...
也许是这样:

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 WHEN p.ProjNo = '12345' THEN ' ' ELSE p.ProjTitle end AS ProjTitle

只是在这里猜测-这一切似乎仍然有点不清楚-这个8位数的文档编号也是项目编号(也就是8位数),所以也许你需要的是改变连接条件

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

我们仍在努力了解什么东西(如果有的话)正在起作用,以便我们能够了解如何修复不起作用的东西。但我会试试别的:

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

当你遇到a=B=C的情况时,你想做什么?这是无效的语法,我不明白你认为它应该做什么。你的代码充满了语法错误。发布示例数据和预期结果,并解释您想要做什么。@avery我正在尝试更改视图。。目前它有p.projNo、d.DocumentNo和所有连接。我试图使用p.ProjNo列的CASE语句来包含3个新的p.ProjNo。新的3个p.projNo是d.DocumentNo.中的前8个字符。。希望这是清楚的?我是新来的,现在很喜欢。你需要发布现有的视图,或者至少发布足够的视图,这样我们才能看到你试图修改的内容。我仍然认为我的答案与你描述的相符。它或者需要替换select中的p.ProjNo,或者可能需要将其添加到子查询甚至join子句中。所以在有p.projNo专栏之前。我试图在该列中使用CASE语句。如果它在视图中,则它是SELECT语句。UpdatedI仍然得到错误——“在需要条件的地方指定了一个非布尔类型的表达式”——在左边(d.DocumentNo,8)),我有额外的括号。Removed这不起作用,因为“12345”被分为3个婴儿项目,每个项目都有不同的projNo和projTitle