CASE выражение с функцией LEFT - PullRequest
0 голосов
/ 25 сентября 2019

РЕДАКТИРОВАТЬ Вид выглядит следующим образом

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 - это первые 8 символов DocumentNo.

Попытка: я попытался использовать выражение 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.Ожидая И, ИЛИ, ТО
3) Неверный синтаксис почти у всех 3 '=' Ожидая И, ИЛИ, ТО

Может кто-нибудь сказать мне, что я делаю неправильно, и помочь мне разобраться в этом?направление

Ответы [ 4 ]

0 голосов
/ 26 сентября 2019

Все еще пытаемся понять, что, если вообще что-то работает, так что мы можем понять, как исправить то, что не работает.Но я попробую что-то еще:

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
0 голосов
/ 25 сентября 2019

Может быть, это:

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

Это то, как вы будете использовать ProjNo, если ProjNo не равен «12345», тогда в этом случае вы замените первые 8 из DocumentNo.Вы должны использовать это в своих операторах выбора и / или операторах соединения.

Если это также влияет на ProjTitle, то отдельный оператор для него:

CASE WHEN p.ProjNo = '12345' THEN ' ' ELSE p.ProjTitle end AS ProjTitle
0 голосов
/ 26 сентября 2019

Просто угадайте здесь - все это кажется немного неясным - этот 8-значный номер документа также является номером проекта (т.е. тоже 8-значным), поэтому, возможно, вам нужно изменить это условие соединения ...

INNER JOIN [DB].[dbo].[Project] p 
ON ( 
       (d.ProjNo = p.ProjNo) 
       OR 
       (len(d.DocumentNumber) = 8 AND d.DocumentNo = p.ProjNo)
   )
0 голосов
/ 25 сентября 2019

То есть вы используете 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 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...