我正在尝试在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
答案 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
...