Вы не можете использовать IF в прямом SQL-выражении, вместо этого используйте CASE WHEN test THEN returniftrue ELSE valueiffalse END
(если вам нужно использовать условную логику)
Тем не менее, этого можно избежать, если вы сделаете что-то вроде этого:
WHERE
(somecolumn = 'MAIL' AND ContentCode = 'M') OR
(somecolumn <> 'MAIL' and ContentCode <> 'M')
Пример условной логики в прямом SQL:
SELECT * FROM table
WHERE
CASE WHEN col > 0 THEN 1 ELSE 0 END = 1
Случай, когда выполняется тест и возвращается значение.Вы всегда должны сравнивать возвращаемое значение с чем-то другим.Вы не можете сделать что-то, что не возвращает значение.
Здесь это довольно глупо, потому что все, что вы можете выразить в правде, может быть проще и понятнее выразить в правденепосредственно в предложении where ..
SELECT * FROM table
WHERE
CASE WHEN type = 'x'
THEN (SELECT count(*) FROM x)
ELSE (SELECT count(*) FROM y)
END = 1
Versus
SELECT * FROM table
WHERE
(type = 'x' AND (SELECT count(*) FROM x) = 1) OR
type <> 'x' AND (SELECT count(*) FROM y) = 1)
Это полезно для таких вещей, как это:
SELECT
bustourname,
SUM(CASE WHEN age > 60 THEN 1 ELSE 0 END) as count_of_old_people
FROM table
GROUP BY bustourname
Если вы хотите написатьхранимая процедура, которая условно создает SQL, тогда, конечно, вы можете сделать это ...
DECLARE @sql VARCAHR(max) = 'SELECT * FROM TABLE WHERE';
IF blah SET @sql = CONCAT(@sql, 'somecolumn = 1')
IF otherblah SET @sql = CONCAT(@sql, 'othercolumn = 1')
EXEC @sql...
Но это только в хранимой процедуре или в похожем на процедуру сценарии sql, где она создает строку, которая выглядит какSQL, а затем выполняет его динамически.Вы не можете использовать IF в простом выражении SELECT