建筑群 SQL 命令

Building complex SQL command

我将 sql 用于 select、更新、插入和其他一些功能,但到目前为止只有简单的功能。现在我需要写一个复杂的命令。

我看过使用 case 但我不知道如何实现它。

它应该是这样的:

SELECT KVIZ_ISTORIJA.ID AS ISTORIJAID, KVIZ_PITANJA.PITANJE1, ~TACNO~
FROM KVIZ_ISTORIJA 
INNER JOIN KVIZ_PITANJA ON KVIZ_ISTORIJA.PITANJEID = KVIZ_PITANJA.PITANJEID 
WHERE REZULTATID = 12

我用 ~TACNO~ 指出我需要条件值的地方。

我如何在 C# 中编写条件是这样的(我将使用 table 中的列名作为变量):

int ~TACNO~ = -1;
int I = -1;

if(KVIZ_PITANJA.ODGOVOR1_TACAN == 1)
    I = 1;
else if(KVIZ_PITANJA.ODGOVOR2_TACAN == 1)
    I = 2;
else if(KVIZ_PITANJA.ODGOVOR3_TACAN == 1)
    I = 3;
else if(KVIZ_PITANJA.ODGOVOR4_TACAN == 1)
    I = 4;
else if(KVIZ_PITANJA.ODGOVOR5_TACAN == 1)
    I = 5;

switch(I)
{
    case 1:
        if(KVIZ_ISTORIJA.ODGOVORENO1 = 1)
            ~TACNO~ = 1;
       break;
    case 2:
        if(KVIZ_ISTORIJA.ODGOVORENO2 = 1)
            ~TACNO~ = 1;
       break;
    case 3:
        if(KVIZ_ISTORIJA.ODGOVORENO3 = 1)
            ~TACNO~ = 1;
       break;
    case 4:
        if(KVIZ_ISTORIJA.ODGOVORENO4 = 1)
            ~TACNO~ = 1;
       break;
    case 5:
        if(KVIZ_ISTORIJA.ODGOVORENO5 = 1)
            ~TACNO~ = 1;
       break;
}

如何在 SQL 查询中编写与此 C# 条件等效的内容?

您可以像这样使用搜索到的CASE

case 
  when (KVIZ_PITANJA.ODGOVOR1_TACAN = 1 and KVIZ_ISTORIJA.ODGOVORENO1 = 1) then 1
  when (KVIZ_PITANJA.ODGOVOR2_TACAN = 1 and KVIZ_ISTORIJA.ODGOVORENO2 = 1) then 1
  when (KVIZ_PITANJA.ODGOVOR3_TACAN = 1 and KVIZ_ISTORIJA.ODGOVORENO3 = 1) then 1
  when (KVIZ_PITANJA.ODGOVOR4_TACAN = 1 and KVIZ_ISTORIJA.ODGOVORENO4 = 1) then 1
  when (KVIZ_PITANJA.ODGOVOR5_TACAN = 1 and KVIZ_ISTORIJA.ODGOVORENO5 = 1) then 1
  else -1
end

您也可以将其作为单个 when 子句,通过使用 OR 加入条件,但我认为这不太可读:

case 
  when (KVIZ_PITANJA.ODGOVOR1_TACAN = 1 and KVIZ_ISTORIJA.ODGOVORENO1 = 1)
    or (KVIZ_PITANJA.ODGOVOR2_TACAN = 1 and KVIZ_ISTORIJA.ODGOVORENO2 = 1)
    or (KVIZ_PITANJA.ODGOVOR3_TACAN = 1 and KVIZ_ISTORIJA.ODGOVORENO3 = 1)
    or (KVIZ_PITANJA.ODGOVOR4_TACAN = 1 and KVIZ_ISTORIJA.ODGOVORENO4 = 1)
    or (KVIZ_PITANJA.ODGOVOR5_TACAN = 1 and KVIZ_ISTORIJA.ODGOVORENO5 = 1) then 1
  else -1
end

但正如 Arioch'The 在评论中所建议的那样:考虑规范化您的设计,这样您就不会在单个 table 中有重复的列,而是在多个行中使用鉴别器列。它会简化这样的事情。