Можно выбрать несколько столбцов из одного оператора CASE? - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть три логических столбца в таблице, которые определяют, какие значения должны быть переданы в программу.Мне нужно передать до 3 меток и значений в мою программу.

На данный момент у меня есть 8 случаев для каждой метки и каждого значения (так как 3 логических флага означают 2 ^ 3 = 8 комбинаций).Есть ли способ сделать его более лаконичным?

Например, для моего первого ярлыка у меня есть

    case
    WHEN travelExpenseEnabled=0 and otherExpenseEnabled=0 and materialExpenseEnabled = 0 THEN
    ''
    WHEN travelExpenseEnabled=1 and otherExpenseEnabled=0 and materialExpenseEnabled = 0 THEN
    'Estimated Travel Expense'
    WHEN travelExpenseEnabled=1 and otherExpenseEnabled=1 and materialExpenseEnabled = 0 THEN
    'Estimated Travel Expense'
    WHEN travelExpenseEnabled=1 and otherExpenseEnabled=0 and materialExpenseEnabled = 1 THEN
    'Estimated Material'
    WHEN travelExpenseEnabled=1 and otherExpenseEnabled=1 and materialExpenseEnabled = 1 THEN
    'Estimated Material'
    WHEN travelExpenseEnabled=0 and otherExpenseEnabled=1 and materialExpenseEnabled = 0 THEN
    CONCAT('Estimated ', listquotes.otherLabel)
    WHEN travelExpenseEnabled=0 and otherExpenseEnabled=1 and materialExpenseEnabled = 1 THEN
    'Estimated Material'
    WHEN travelExpenseEnabled=0 and otherExpenseEnabled=0 and materialExpenseEnabled = 1 THEN
    'Estimated Material'
    END as optLabel1,

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

    case
    WHEN travelExpenseEnabled=0 and otherExpenseEnabled=0 and materialExpenseEnabled = 0 THEN
    '' as optLabel1,
            '' as optLabel2,
            '' as optLabel3,
            0.00 as estCost1,
            0.00 as estCost2,
            0.00 as estCost3,
    WHEN travelExpenseEnabled=1 and otherExpenseEnabled=0 and materialExpenseEnabled = 0 THEN
'Estimated Travel' as optLabel1,
'' as optLabel2,
'' as optLabel3,
travelExpense as estCost1,
0.00 as estCost2,
0.00 as estCost3

и т. Д. Для каждого случая.Таким образом, я могу установить каждое из 3-х значений, которые мне нужно, всего в 8 случаях, вместо того, чтобы делать 8 случаев на одно значение.Это возможно?Я использую MySQL 5.6

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Я бы предложил справочную таблицу или производную таблицу:

select t.*,
       ref.optlabel1
from t left join
     (select 0 as travelExpenseEnabled, 0 as otherExpenseEnabled, 0 as materialExpenseEnabled, '' as optlabel1 union all
      select 1, 0, 0, 'Estimated Travel Expense' union all
      ...
     ) ref
     on ref.travelExpenseEnabled = t.travelExpenseEnabled and
        ref.otherExpenseEnabled = t.otherExpenseEnabled and
        ref.materialExpenseEnabled = t.materialExpenseEnabled

Вы можете включить все нужные вам метки в подзапрос.

1 голос
/ 08 апреля 2019

Если вы извлекаете это из дБ во время выполнения на пользовательском интерфейсе (я полагаю), вы можете заранее сгладить ваши данные.

Я бы взял ваш код, поместите его внутриуниверсальный select-view, пусть приложение выполняет SELECT {... columnList ...} из VIEWNAME, где KEY = variable и т. д.

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

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