Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL语句-如何对不同的选择使用多个CASE?_Mysql_Sql_Case - Fatal编程技术网

Mysql SQL语句-如何对不同的选择使用多个CASE?

Mysql SQL语句-如何对不同的选择使用多个CASE?,mysql,sql,case,Mysql,Sql,Case,我对SQL非常熟悉,我正在使用PHP生成器软件进行快速应用程序开发 我有一个下拉列表,我需要为查找应用SQL语句,以填充下拉列表 如果这是Javascript,那么就很容易了,但不知道如何继续使用SQL 我的表格中有不同类型的项目,每个项目的类型可以是: 'P' 'B' 'O' 'S' 当我打开一个项目时,它会加载它的信息,我需要根据项目类型填充此下拉列表 我的表格中的下拉列表是一个Tinyint 对于所选项目,我在全局变量中有ItemID(表中的PK),要从中检索该项目的类型,一个简单的SE

我对SQL非常熟悉,我正在使用PHP生成器软件进行快速应用程序开发

我有一个下拉列表,我需要为查找应用SQL语句,以填充下拉列表

如果这是Javascript,那么就很容易了,但不知道如何继续使用SQL

我的表格中有不同类型的项目,每个项目的类型可以是:

'P'
'B'
'O'
'S'
当我打开一个项目时,它会加载它的信息,我需要根据项目类型填充此下拉列表

我的表格中的下拉列表是一个
Tinyint

对于所选项目,我在全局变量中有
ItemID
(表中的PK),要从中检索该项目的
类型
,一个简单的
SELECT
应该可以:

SELECT ItemType
FROM TblItem
WHERE ItemID = [ItemID]
因此,通过这个
选择
现在我有了我的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;
}
对于每个案例代码块,我会使用不同的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
,如上所示,最后,在SQL中实现某种
CASE
语句来填充基于类型的下拉列表


谢谢

SQL中的case语句用于一个非常不同的case:它在逐行的基础上进行case切换,而不是在查询级别

我认为,创建一个包含您希望存储在下拉列表中的项目的新表,然后使用itemId从该表中选择正确的行并填充下拉列表会容易得多。大概是这样的:

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

在这种情况下,您不必使用case语句,直接从表中选择所有必要的行。您甚至可以使用联接在一个查询中实现这一点。

您可以使用
内部联接
,将所有可能的下拉记录放入一个表中,正如我所说的
tblDropDownItems
,当您使用过滤表
TblItem
联接此表时,使用一个额外的列Reference-ItemType,您只有与检索到的项目类型相关的记录:

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

最好只是重新设计表以包含该信息。@MatBailie如果授权在DB中重新设计表,最好在DB中有一个类似tblDropDownItems的表。
SQL
中的
CASE
操作符更像是一个立即if<代码>x=y时的情况,然后是a时的情况,然后是xy时的情况,然后是c时的情况,最后是d端
。它允许您编码标量值函数,而不是用于编程流控制,因此您只需在过程代码中使用
IF
语句(在任何
SELECT
语句之外)。您最好重构您的表,以便
SELECT*FROM table WHERE itemID=?itemType=?
将为您提供所需的所有行以及所需的所有列。