SQL, где пункт только для включения, если случай, когда - PullRequest
2 голосов
/ 28 ноября 2011

Мне было интересно, можно ли запустить скрипт для нескольких Клиентов, где я могу добавить дополнительные операторы where, когда я работаю для указанного Клиента, без необходимости перезаписывать базовый скрипт несколько раз?

Например,базовый сценарий

SELECT Status, count(distinct T1.AccountNo)
FROM Orders (nolock), Accounts (NOLOCK)
WHERE Orders.AccountNo = Accounts .AccountNo  
AND date between '1 Oct 2011' and '31 Oct 2011'
GROUP BY Status

Но когда я запускаю для клиента AI, я хотел бы включить дополнительные критерии

AND Accounts.Role IN ('User','Admin')
AND Accounts.Active= 'Y'

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011
SELECT Status, count(distinct T1.AccountNo)
FROM Orders (nolock), Accounts (NOLOCK)
WHERE Orders.AccountNo = Accounts .AccountNo  
AND date between '1 Oct 2011' and '31 Oct 2011'
AND CASE WHEN Client = 'A' THEN Accounts.Role ELSE 'User' END IN ('User', 'Admin')
AND CASE WHEN Client = 'A' THEN Accounts.Active ELSE 'Y' END = 'Y'
GROUP BY Status
1 голос
/ 28 ноября 2011

На SQL Server вы можете использовать HOST_NAME () следующим образом:

SELECT Status, count(distinct T1.AccountNo)
FROM Orders (nolock), Accounts (NOLOCK)
WHERE Orders.AccountNo = Accounts .AccountNo  
AND date between '1 Oct 2011' and '31 Oct 2011'
AND ((HOST_NAME() <> 'ClientA') OR (Accounts.Role IN ('User') AND Accounts.Active= 'Y'))
GROUP BY Status
0 голосов
/ 28 ноября 2011

Это часто встречается в хранимых процедурах, когда параметр не нужен:

SELECT *
FROM SomeTable
WHERE ((@myvariable IS NULL OR @myvariable = mycolumn))

К сожалению, это обычно вызывает сканирование, так как оно может или не может иметь короткое замыкание.

Другой пример, который я собирался опубликовать, такой же, как у Дерека Кромма.

Наконец, вы можете использовать Динамический SQL - люди либо любят его, либо ненавидят.

...