SQL Выбор строк на основе параметров

поэтому я создал таблицу клиентов, которая выглядит примерно так

SQL Выбор строк на основе параметров

Каждый клиент является либо новым, либо повторяющимся, либо повторно активированным, и каждый клиент может быть только одного типа, поэтому независимо от его типа в этом поле стоит 1, а во всех остальных полях — 0.

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

Я не знаю, как это сделать.

Я выполнил весь запрос, мне просто нужна помощь с предложением where.

Псевдокод будет примерно таким

Case when @CustomerType = 'NEW'
THEN where cs.brandnewcustomer = 1

Case when @CustomerType = 'RECURRING'
THEN where cs.recurringcustomer= 1

Case when @CustomerType = 'REACTIVATED'
THEN where cs.reactivatedcustomer= 1

else case when @CustomerType = 'All' end

Есть ли у кого-нибудь советы о том, как превратить это в реальный код?

Вы можете использовать условие if, if (@customerType='new') begin select * from table where brandnewcustomer=1 end .. и т.д.

Hardik Patel 19.06.2019 19:18
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
509
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете сформировать свои условия как:

WHERE (cs.brandnewcustomer = 1 AND @CustomerType = 'NEW')
      OR
      (cs.recurringcustomer = 1 AND @CustomerType = 'RECURRING')
      OR
      (cs.reactivatedcustome = 1 AND @CustomerType = 'REACTIVATED')
      OR
      (@CustomerType = 'ALL')
or (@CustomerType = 'All')
Gordon Linoff 19.06.2019 20:22

@GordonLinoff Да, только что добавил. Спасибо.

Ilyes 19.06.2019 20:23

Поместите этот оператор CASE в предложение WHERE:

select * from customers 
where 1 = case @CustomerType
    when 'NEW' then brandnewcustomer
    when 'RECURRING' then recurringcustomer
    when 'REACTIVATED' then reactivatedcustomer
    when 'All' then 1
  end

Если параметр не соответствует ни одному из 4 значений, то ничего не будет возвращено.
Смотрите демо.

Это должно быть структурировано следующим образом:

SELECT ... FROM ...
WHERE cs.brandnewcustomer = CASE WHEN @CustomerType = 'NEW' THEN 1 ELSE 0 END
AND cs.recurringcustomer = CASE WHEN @CustomerType = 'RECURRING' THEN 1 ELSE 0 END
AND cs.reactivatedcustomer = CASE WHEN @CustomerType = 'REACTIVATED' THEN 1 ELSE 0 END
OR 1 = CASE WHEN @CustomerType = 'All' THEN 1 ELSE 0 END

Некоторые другие решения работают, но мое — единственное из перечисленных (пока что), обеспечивающее целостность данных. Если (случайно) у вас есть резервные данные, в которых 1 соответствует более чем одному типу клиентов, вы получите совпадение «первой победы» с остальными. С моим никто не выиграет за неточные данные.

DrDoomPDX 21.06.2019 13:15

Я думаю, что это должно быть нормализовано

Типы клиентов должны быть в таблице с первичным ключом tb_CustomerType.

введите описание изображения здесь

Таблица клиентов должна иметь внешний ключ для типа клиента tb_Customer

введите описание изображения здесь

вам не нужно иметь оператор case, если у вас такая структура таблицы

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

DrDoomPDX 21.06.2019 13:39

Это может быть воспринято как решение, если окружающая среда не может быть изменена, но я действительно считаю, что правильный путь должен быть указан, чтобы другие могли думать под другим углом к ​​решению.

indika ranaweera 21.06.2019 15:42

Другие вопросы по теме