Инструкция SQL — как использовать множественный РЕГИСТР с разным SELECT?

#mysql #sql #case

#mysql #sql #регистр

Вопрос:

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

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

Если бы это был Javascript, это было бы легко, но не уверен, как действовать с SQL.

В моей таблице есть элементы с разными типами, типы каждого элемента могут быть:

 'P'
'B'
'O'
'S'
  

когда я открываю элемент, он загружает свою информацию, и мне нужно заполнить этот выпадающий список в зависимости от типа элемента.

Выпадающий список в моей таблице — это Tinyint .

Для выбранного элемента у меня есть ItemID (PK в таблице) в глобальной переменной, оттуда, чтобы получить Type этот элемент, должно сработать простое SELECT :

 SELECT ItemType
FROM TblItem
WHERE ItemID = [ItemID]
  

итак, с этим SELECT теперь у меня есть свой ItemType.

Оттуда теперь мне нужно заполнить выпадающий список на основе ItemType

С помощью Javascript я бы сделал что-то вроде:

 switch(ItemType) {
  case 'B':
    // code block
    break;
  case 'P':
    // code block
    break;
 case 'S':
    // code block
    break;
 case 'O':
    // code block
    break;
}
  

и для каждого блока кода CASE я бы поместил другой оператор SELECT для заполнения моего выпадающего списка, например:

 case 'B':
  SELECT 0 AS TaskID, 'Installation' AS TaskName
  UNION
  SELECT 1 AS TaskID, 'Setup' AS TaskName
  UNION
  SELECT 2 AS TaskID, 'Feedback' AS TaskName
  UNION
  SELECT 3 AS TaskID, 'Customer' AS TaskName

case 'P':
  SELECT 4 AS TaskID, 'Production' AS TaskName
  UNION
  SELECT 5 AS TaskID, 'Debug' AS TaskName
  UNION
  SELECT 6 AS TaskID, 'Review' AS TaskName
  UNION
  SELECT 7 AS TaskID, 'Network' AS TaskName
  

и так далее, поэтому каждый раз, когда я открываю представление сведений об элементе, я извлекаю его ItemID из глобальной переменной, затем я должен использовать это ID для извлечения ItemType , как показано выше, и, наконец, реализовать какой-то CASE оператор в SQL для заполнения выпадающего списка на основе типа

Спасибо

Комментарии:

1. В SQL CASE оператор больше похож на immediate-if. CASE WHEN x=y THEN a WHEN x<y THEN b WHEN x>y THEN c ELSE d END . Это позволяет вам кодировать скалярнозначные функции, это не для программного управления потоком, для этого вы просто используете IF инструкции в своем процедурном коде (вне любого SELECT оператора) . Вам лучше провести рефакторинг вашей таблицы, чтобы SELECT * FROM table WHERE itemID = ? AND itemType = ? получить все нужные строки со всеми необходимыми столбцами.

Ответ №1:

У вас может быть хитрость с INNER JOIN , поместите все возможные записи выпадающего списка в таблицу, как я ее назвал tblDropDownItems , с дополнительным столбцом, ссылающимся на ItemType, когда вы соединяете эту таблицу с фильтрованной таблицей TblItem , у вас просто есть записи, связанные с типом извлеченного элемента:

 SELECT tblDropDownItems.TaskID, tblDropDownItems.TaskName
FROM
    (SELECT 0 AS TaskID, 'Installation' AS TaskName, 'B' AS ItemType
     UNION
     SELECT 1 AS TaskID, 'Setup' AS TaskName, 'B' AS ItemType
     UNION
     SELECT 2 AS TaskID, 'Feedback' AS TaskName, 'B' AS ItemType
     UNION
     SELECT 3 AS TaskID, 'Customer' AS TaskName, 'B' AS ItemType
     UNION
     SELECT 4 AS TaskID, 'Production' AS TaskName, 'P' AS ItemType
     UNION
     SELECT 5 AS TaskID, 'Debug' AS TaskName, 'P' AS ItemType
     UNION
     SELECT 6 AS TaskID, 'Review' AS TaskName, 'P' AS ItemType
     UNION
     SELECT 7 AS TaskID, 'Network' AS TaskName, 'P' AS ItemType
     UNION
     . . . your select clause for 'S' ItemType
     UNION
     . . . your select clause for 'O' ItemType) tblDropDownItems
INNER JOIN
     (SELECT ItemType
      FROM TblItem
      WHERE ItemID = [ItemID]) tblItemType
ON tblDropDownItems.ItemType = tblItemType.ItemType
  

Комментарии:

1. Было бы лучше просто изменить дизайн таблицы, чтобы включить эту информацию.

2. @MatBailie если бы он разрешил перепроектировать таблицы в DB, было бы лучше иметь таблицу типа tblDropDownItems в DB.

Ответ №2:

Оператор case в SQL используется для совсем другого регистра: он переключает регистр по строкам, то есть не на уровне запроса.

Я думаю, было бы намного проще создать новую таблицу, содержащую элементы, которые вы хотите сохранить в своем выпадающем списке, затем использовать ItemId, чтобы выбрать правильные строки из этой таблицы и заполнить выпадающий список. Что-то вроде этого:

 CREATE TABLE `dropdown` (
TaskID int(11) NOT NULL,
TaskName varchar(32) NOT NULL,
ItemID int(11) NOT NULL,
PRIMARY KEY(TaskID));
  

В этом случае вам не нужно использовать инструкцию CASE и напрямую выбирать все необходимые строки из таблицы. И вы, вероятно, могли бы даже сделать это в одном запросе, используя соединение.