如果SQLite中的条件替换以下内容

时间:2015-06-26 19:43:13

标签: sqlite

我正在尝试在SQLite中替换以下SQL查询,但似乎我没有太多选项可用于在SQLite中完全编写此查询。我知道使用SQLite不存在的地方但不确定如果有嵌套if条件之后如果不存在条件如下,则如何使用相同的条件。我可以在后面的代码中处理这个问题,但想知道在SQLite查询中是否可以完全解决这个问题。

IF NOT EXISTS (SELECT col1 from tb1 where tbl.id= @someId)
    BEGIN
        SET NOCOUNT ON;

        IF @someparam=@otherparam
            SELECT col1,col2 from tb1
            where tb1.somecolumn='xyz' or tb1.someothercolumn='pqr' 
            order by case col1 
                WHEN 'something' THEN 1
                WHEN 'someother' THEN 2
                END

        IF @someparam=@otherparam2 OR @someparam = 'xyz'
            SELECT col1,col2 from tb1
            where tb1.somecolumn='abc' or tb1.someothercolumn='def' 
            order by case col1 
               WHEN 'something' THEN 2
                WHEN 'someother' THEN 1
                END
    END
ELSE
    BEGIN
        SET NOCOUNT ON;
        IF @someparam2=@otherparam3
SELECT col1,col2 from (select distinct col1, col2 from tb3, tb1 where somecolumn not in 
(select acolumn from tb1 where ggg = hhh) and tb1.somecolumn = 'zzz') as wwww
            order by case col1
               WHEN 'nnn' THEN 1
               WHEN 'mmm' THEN 2
               WHEN 'kkk' THEN 3
                END 

        IF @someparam2=@otherparam4 OR @someparam = 'xyz'
            SELECT col1,col2 from tb1
            where tb1.somecolumn='ccc' or tb1.someothercolumn='ddd'
            order by case col1
               WHEN 'nnn' THEN 2
               WHEN 'mmm' THEN 3
               WHEN 'kkk' THEN 1
                END 
    END
END

1 个答案:

答案 0 :(得分:0)

如果您在最终查询中有相同的列,则可以UNION查询,然后按照以下步骤过滤您的预期结果:

SELECT col1, col2
FROM tb1
WHERE 
    1 = CASE 
        WHEN (NOT EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam = @otherparam) AND
             (tb1.somecolumn='xyz' or tb1.someothercolumn='pqr') THEN 1
        WHEN (NOT EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam = @otherparam2 OR @someparam = 'xyz') AND
             (tb1.somecolumn='abc' or tb1.someothercolumn='def') THEN 1
        WHEN (EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam2 = @otherparam3) AND
             (tb1.somecolumn='aaa' or tb1.someothercolumn='bbb') THEN 1
        WHEN (EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam2 = @otherparam4 OR @someparam = 'xyz') AND
             (tb1.somecolumn='ccc' or tb1.someothercolumn='ddd') THEN 1
        ELSE 0
        END
ORDER BY
    CASE 
        WHEN (NOT EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam = @otherparam AND col1 = 'something') THEN 1
        WHEN (NOT EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam = @otherparam AND col1 = 'someother') THEN 2

        WHEN (NOT EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam = @otherparam2 OR @someparam = 'xyz') AND
             (col1 = 'something') THEN 2
        WHEN (NOT EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam = @otherparam2 OR @someparam = 'xyz') AND
             (col1 = 'someother') THEN 1

        WHEN (EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam2 = @otherparam3) AND
             (col1 = 'nnn') THEN 1
        WHEN (EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam2 = @otherparam3) AND
             (col1 = 'mmm') THEN 2
        WHEN (EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam2 = @otherparam3) AND
             (col1 = 'kkk') THEN 3

        WHEN (EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam2 = @otherparam4 OR @someparam = 'xyz') AND
             (col1 = 'nnn') THEN 2
        WHEN (EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam2 = @otherparam4 OR @someparam = 'xyz') AND
             (col1 = 'mmm') THEN 3
        WHEN (EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             (@someparam2 = @otherparam4 OR @someparam = 'xyz') AND
             (col1 = 'kkk') THEN 1

        ELSE 10
    END

或者您可以像这样混合ORDER BY

ORDER BY
    CASE 
        WHEN ((NOT EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             ((@someparam = @otherparam AND col1 = 'something') OR
             ((@someparam = @otherparam2 OR @someparam = 'xyz') AND (col1 = 'someother'))) OR
             ((EXISTS(SELECT col1 from tb1 where tbl.id=@someId)) AND 
             ((@someparam2 = @otherparam3 AND col1 = 'nnn') OR
             ((@someparam2 = @otherparam4 OR @someparam = 'xyz') AND (col1 = 'kkk'))) THEN 1
         ...