Как я могу получить пропущенное значение из "где в ()" в T-SQL? - PullRequest
0 голосов
/ 10 мая 2018

Если у меня есть таблица со столбцом с именем «Идентификаторы» и другим столбцом с именем «клиенты», и у меня есть следующие данные:

IDs     Clients
----------------
1       A
2       B
3       C
4       D

Я пытаюсь получить идентификаторы для нескольких клиентов безнаписание запроса для каждого.

Итак, я использую:

select ids 
from table1 
where clients in (A,B,E,C)

Это возвращает

1,2,3

Но мне нужно знать, что E отсутствует.Так что мне действительно нужно

1,2,NULL,3

Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы можете встроить значения

declare @t table (id int, client char(1))
insert into @t values 
(1, 'A'),
(2, 'B'),
(3, 'C'),
(4, 'D');

select * 
from @t;

SELECT q.client, t.id
FROM ( values ('A'), ('B'), ('E') ) q(client)
left join @t t
on t.client = q.client;

Не используйте множественное число для столбцов. Ряд единственного числа.

0 голосов
/ 10 мая 2018

Вставьте свои данные в таблицу и выполните запрос, как показано ниже

declare @tbl table (ids int, clients varchar(10))
insert into @tbl values
(1,'A')
,(2,'B')
,(3,'C')
,(4,'D')

SELECT * FROM @tbl

declare @value table (Val varchar(10))

insert into @value values
('A')
,('B')
,('C')
,('E')

select ids,t1.Val
from @tbl t
RIGHT JOIN @value t1 on t1.Val = t.clients

Опция оповещения.

declare @tbl table (ids int, clients varchar(10))
insert into @tbl values
(1,'A')
,(2,'B')
,(3,'C')
,(4,'D')

Для SQL Server 2016 и выше

Declare @var varchar(50) = 'A,B,C,E'
SELECT ids, t1.value
FROM @tbl t
RIGHT JOIN STRING_SPLIT(@var, ',') t1 on t1.value = t.clients

Для ниже, чем SQL Server 2016, используйте запрос ниже. Вы должны создать функцию strparse. приведенный ниже сценарий

SELECT ids, t1.Keys
FROM @tbl t
RIGHT JOIN dbo.StrParse (',', @var) t1 on t1.Keys = t.clients

go

Создать функцию разбора строки на строки

CREATE FUNCTION [dbo].[StrParse]
               (@delimiter CHAR(1),  
                @csv       NTEXT)  
RETURNS @tbl TABLE(Keys  NVARCHAR(255))  
AS  

  BEGIN  
    DECLARE  @len INT  
    SET @len = Datalength(@csv)  
    IF NOT @len > 0  
      RETURN  

    DECLARE  @l INT  
    DECLARE  @m INT  

    SET @l = 0  
    SET @m = 0  

    DECLARE  @s VARCHAR(255)  
    DECLARE  @slen INT  

    WHILE @l <= @len  
      BEGIN  

        SET @l = @m + 1--current position  
        SET @m = Charindex(@delimiter,Substring(@csv,@l + 1,255))

        IF @m <> 0  
          SET @m = @m + @l  
        --insert @tbl(keys) values(@m)  
        SELECT @slen = CASE   
                         WHEN @m = 0 THEN 255
                         ELSE @m - @l  
                       END 

        IF @slen > 0  
          BEGIN  
            SET @s = Substring(@csv,@l,@slen)  
            INSERT INTO @tbl  
                       (Keys)  
            SELECT @s  
          END  

        SELECT @l = CASE   
                      WHEN @m = 0 THEN @len + 1
                      ELSE @m + 1  
                    END
      END  

    RETURN  
  END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...