Проверка условия, только если внешняя переменная соответствует значению - PullRequest
0 голосов
/ 25 марта 2019

У меня есть SQL-запрос, в котором я хочу, чтобы только некоторые условия проверялись, если выполняется внешнее условие, т. Е. Если переменная соответствует определенному значению, которое устанавливается вне запроса (часть программы Ruby).

Например, в базе данных информации о книге у меня есть переменная «author», которая заполнена именем человека или «None».Я сравниваю значения этой книги с другими книгами и хотел бы, чтобы эта переменная направлялась в SQL-запрос, чтобы, если author = 'None', было указано указанное условие.Если это что-то отличное от 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 ]

1 голос
/ 25 марта 2019

Вы можете сделать это

SELECT * FROM db AS data 
where 
(@author = 'None' and AND data.random_field <> '123')
or
(@author !='None')
1 голос
/ 25 марта 2019

Вы можете попытаться выполнить это, создав динамический SQL-запрос и добавив свое условие на основе переменной input:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...