#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 и напрямую выбирать все необходимые строки из таблицы. И вы, вероятно, могли бы даже сделать это в одном запросе, используя соединение.