仅当外部变量与值匹配时检查条件

时间:2019-03-25 16:11:45

标签: sql sql-server

我有一个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查询中,还是在查询中设置变量,然后以某种方式基于该值创建条件?

2 个答案:

答案 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')