我有一个SQL查询,在该查询中,我只希望在满足外部条件的情况下检查某些条件,即如果变量与特定值匹配,则该值在查询外部设置(Ruby程序的一部分)。
例如,在书籍信息数据库中,我有一个变量“ author”,其中填充了一个人的名字或“ None”。我正在将这本书的值与其他书进行比较,并希望将该变量转移到SQL查询中,以便在author = 'None'
时检查指定的条件。如果不是“无”,则可以忽略该条件。理论上可以这样工作的东西:
SELECT *
FROM db AS data
WHERE 1=1
AND data.random_field <> '123' if #{author} <> 'None'
我尝试过:
AND NOT (#{author} = 'None' AND data.random_field <> '123')
这显然不起作用,因为author
变量的值被解释为字段名称,而不仅仅是变量。
我的另一种想法是改为从子查询中获取原始的author
值,而不是作为外部变量(因为数据源自同一数据库)。像这样:
SELECT DISTINCT author
FROM db AS data
WHERE 1=1
AND data.id = '[original_book_id]'
然后将其保存在查询本身中作为author
变量。我不确定这两个选项中的哪个是可行的,或者更好-将外部变量插入SQL查询中,还是在查询中设置变量,然后以某种方式基于该值创建条件?
答案 0 :(得分:1)
您可以尝试通过构造动态sql查询并根据变量输入添加条件来实现此目的:
DECLARE @dsql NVARCHAR(MAX),
@author VARCHAR(100)
SET @dsql = 'SELECT * FROM db AS data WHERE 1=1 '
IF @author = 'None'
BEGIN
SET @dsql = @dsql + 'AND data.random_field <> ''123'' '
END
EXEC sp_executesql @dsql
如果@author ='None',则执行的结果查询将是:
SELECT * FROM db AS data WHERE 1=1 AND data.random_field <> '123'
否则它将是:
SELECT * FROM db AS data WHERE 1=1
答案 1 :(得分:1)
您可以这样做
SELECT * FROM db AS data
where
(@author = 'None' and AND data.random_field <> '123')
or
(@author !='None')