构建复杂的SQL命令

构建复杂的SQL命令,sql,firebird,Sql,Firebird,我正在使用sql进行选择、更新、插入和其他一些功能,但到目前为止,这些功能都很简单。现在我需要编写一个复杂的命令 我看过用例,但不知道如何实现它 它应该是这样的: SELECT KVIZ_ISTORIJA.ID AS ISTORIJAID, KVIZ_PITANJA.PITANJE1, ~TACNO~ FROM KVIZ_ISTORIJA INNER JOIN KVIZ_PITANJA ON KVIZ_ISTORIJA.PITANJEID = KVIZ_PITANJA.PITANJEID W

我正在使用sql进行选择、更新、插入和其他一些功能,但到目前为止,这些功能都很简单。现在我需要编写一个复杂的命令

我看过用例,但不知道如何实现它

它应该是这样的:

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中编写条件,如下所示,我将使用表中的列名作为变量:

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 
  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

“但是,正如阿里奥奇所建议的那样:考虑规范化设计,这样你就不会在一个表中重复列,而是使用一个带有判别器列的多行。它将简化类似的事情。

使用搜索的案例变量,如中所述,我可以使用它而不是开关,但第一部分如何存储I您根本不需要中间I。您可以直接在if梯形图中为TACNO设置值。它需要得到1。首先,你犯了一个典型的新手错误,就是把相同的值放到不同的列中。您必须重新生成该表,这样将有一个KVIZ_ISTORIJA.ODGOVORENO列和5行,其中一些ID=1…5。这是反SQL、反关系的。现在你在与后果作斗争,结果会越来越多。同样,应该有一列KVIZ_PITANJA.ODGOVOR_TACAN和5行ID=1到5。在为时已晚之前重新构建数据库…我已经像您在第一个示例中所展示的那样完成了,但仍然感谢您将此发布给未来的疑难解答人员。