Выберите данные, где условие соответствует, и если нет, то выберите все? - PullRequest
0 голосов
/ 30 мая 2019
select * from (values
    ('dept1','user1'),
    ('dept2','user2'),
    ('dept3','user3'),
    ('dept4','user4')
    )table1([department],[user])
where [user] = @id

scenario1: @id = 'user1'

dept1

scenario2: @id = 'user5'

dept1
dept2
dept3
dept4

вот как это выглядит из нубийского запроса

declare @id varchar(12) = 'user1'
declare @var int = (select count(*) from table1 where [user] = @id)

select * from table1 where [user] = @id or @var = 0

Ответы [ 6 ]

2 голосов
/ 30 мая 2019
DECLARE @id VARCHAR(5) = 'user1';
--DECLARE @id VARCHAR(5) = 'user5';
  WITH  UsersAndDepartments
AS ( SELECT   *
    FROM     ( VALUES ( 'dept1', 'user1'), ( 'dept2', 'user2'),
            ( 'dept3', 'user3'), ( 'dept4', 'user4') ) x ( [department], [user] )
    )
SELECT  *
FROM    UsersAndDepartments ud1
WHERE   ud1.[user] = 
    CASE 
        WHEN EXISTS ( SELECT 1 FROM UsersAndDepartments ud2 WHERE ud2.[user] = @id ) THEN @id
        ELSE ud1.[user] 
    END

Вышеприведенное просто проверяет пользовательский столбец, существует ли какая-либо строка для идентификатора, в противном случае - для всех.

1 голос
/ 30 мая 2019

Я бы сделал это с простым OR, а не CASE выражением в WHERE.

В общем, вы хотите избегать выражений CASE в предложении WHERE по нескольким причинам:

  • Логика может быть написана почти лаконично с использованием базовых логических операций.
  • Добавление дополнительных конструкций (в дополнение к AND, OR и NOT) только усложняет логику для людей.
  • Это в значительной степени убивает любые пути оптимизации.

Я бы предложил:

with table1 as 
      select v.*
      from (values ('dept1', 'user1'),
                   ('dept2', 'user2'),
                   ('dept3', 'user3'),
                   ('dept4', 'user4')
           ) v([department], [user])
     )
select t1.*
from table1 t1
where t1.[user] = @id or
      not exists (select 1 from table1 t1 where t1.user = @id);
1 голос
/ 30 мая 2019
declare @tab table (id int , value varchar(10))
declare @id int = 4

insert into @tab
select 1,'Ajay'
union all
select 2,'Ajay1'
union all
select 3,'Ajay2'
union all
select 4,'Ajay3'
union all
select 5,'Ajay4'

select * from @tab 
where id = case when exists (select * from @tab where id = @id) then @id else id end
0 голосов
/ 30 мая 2019

Вы можете иметь немного лучший план выполнения, если отделите логику «если существует» от фактического запроса:

DECLARE @id varchar(10) = 'user5'
DECLARE @table TABLE ([department] varchar(10), [user] varchar(10))

insert into @table values 
                    ('dept1','user1'),
                    ('dept2','user2'),
                    ('dept3','user3'),
                    ('dept4','user4')

DECLARE @exists BIT = 
(SELECT 1 FROM @table WHERE [user] = @id)

SELECT department FROM @table
WHERE [user] = CASE @exists WHEN 1 THEN @id ELSE [user] END 
0 голосов
/ 30 мая 2019

вы можете попробовать это:

DECLARE @id varchar(12) = 'user1'

IF EXISTS(SELECT COUNT(*) FROM table1 WHERE [user] = @id)
BEGIN
SELECT * FROM table1 WHERE [user] = @id
END
ELSE
BEGIN
SELECT * FROM table1
END

вы также можете прочитать больше о синтаксисе "EXISTS" на: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/exists-transact-sql?view=sql-server-2017

0 голосов
/ 30 мая 2019

Возможно, вам придется сначала проверить что-то вроде этого

Declare @RowCount int
Select @RowCount = (select count(*) from [Table] Where [Column] = 'xxx')

If @RowCount > 0
 begin 
  Select 1 -- put code here if records
 end
else
 begin
  Select 2 -- put code here if no records
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...