/ / SQL Przecinaj tylko, jeśli podano pewne wartości parametru (Przecięcie warunkowe) - sql, sql-server

Interpretacja SQL tylko jeśli niektóre wartości są podane dla parametru (Interpretacja warunkowa) - sql, sql-server

Mam zapytanie do przecięcia trzech zapytań w oparciu o trzy podane parametry.

Zrobiłem to, używając prostego przecięcia jako czegoś takiego

Select name, email from table1 where param="p1"
intersect
Select name, email from table1 where param="p2"
intersect
Select name, email from table1 where param="p3"

Ale czasem problem jest nielicznyparametry bez danych lub puste. w takim przypadku zapytanie nic nie powoduje z powodu przecięcia z pustymi danymi. Jak więc poradzić sobie z tą sytuacją, aby w przypadku braku danych dla jednego parametru (spośród dowolnego z 3) kwerenda ta nie była rozpatrywana w całości

Odpowiedzi:

2 dla odpowiedzi № 1

Dlaczego używasz INTERSECT trzy razy w tej samej kolumnie? INTERSECT jest w zasadzie an INNER JOIN. Jak już wspomniano, ŁĄCZENIA WEWNĘTRZNE zgodnie ze schematem VENN zwracają tylko zestawy wyników znalezione w każdym kolejnym zapytaniu (co oznacza, że ​​{A} U {B} NIE jest taki sam jak {A} U {C})

W rzeczywistości twoje pytanie nie odpowiada, czy parametr jest @variable, w takim przypadku ze względów indeksowych należy użyć parametru do przeniesienia do zmiennej przed przekazaniem go do zapytania. W przeciwnym razie zapytanie nie będzie korzystało z SARG

Zamiast tego użyj następujących poleceń:

DECLARE @Param  [DATA_TYPE]{#}
, @Param2 [DATA_TYPE]{#}
, @Param3 [DATA_TYPE]{#}

SET @Param = [USP_Proc @param = "p1"]
, @Param2 = [USP_Proc @param = "p2"]
, @Param3 = [USP_Proc @param = "p3"]

SELECT  NAME
, EMAIL
FROM table1
WHERE col_1 = @param
OR col_1 = @param2
OR col_1 = @param3

0 dla odpowiedzi nr 2

Przecięcie zwraca wartości tylko wtedy, gdy wartości w zapytaniu A istnieją również w zapytaniu B, a także w zapytaniu C.

Tak więc w pierwszym przykładzie istnieje wartość „A”wszystkie trzy zapytania, więc zwróci „A”. W drugim przykładzie, gdy przecinasz trzy zapytania, a „A” nie istnieje we wszystkich trzech zapytaniach, więc nie zwraca żadnych wartości. Możesz użyć „Union” zamiast „Intersect”, ponieważ zwraca dane, gdy wartości istnieją w zapytaniu A, B lub C, jak pokazano w trzecim przykładzie, który zwróciłby wartości zarówno „A”, jak i „B”.

Example 1:

SELECT "A"
intersect
SELECT "A"
intersect
SELECT "A"

Example 2:

SELECT "A"
intersect
SELECT "A"
intersect
SELECT "B"

Example 3:

SELECT "A"
UNION
SELECT "A"
UNION
SELECT "B"