Příkaz CASE přepínat, kde jsou podmínky

hlasů
1

Rád bych mít T-SQL příkazu jako následující ...

SELECT [field]
FROM [table]
WHERE CASE @flag
        WHEN 1 THEN col1 = @value
        ELSE col2 = @different_value
      END

Jde o bytost chci dát vlajku v mé funkci používat různá ustanovení, jestliže v tomtéž dotazu. Já prostě nemůže dostat do práce. Je to možné?

Položena 15/07/2010 v 15:50
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
1

MySQL vaše prohlášení by mělo fungovat, protože MySQL podporuje binární výrazy.

Takže musíte to zkusit

SELECT [field] 
FROM [table] 
WHERE CASE @flag 
        WHEN 1 
        THEN case when col1 = @value then 1 else 0 end
        ELSE case when col2 = @different_value then 1 else 0 end 
      END = 1

To není dost dobrý čitelný. Uvědomte si problémy s výkonem, protože optimalizátor může bojovat tady.

Odpovězeno 15/07/2010 v 15:55
zdroj uživatelem

hlasů
4

Bude to práce pro vás?

Where (@flag = 1 and col1 = @value) or (@flag != 1 and col2 = @different_value). 
Odpovězeno 15/07/2010 v 15:56
zdroj uživatelem

hlasů
1

Dynamicky se měnící vyhledávání na základě zadaných parametrů je složité téma a dělat to na jednu stranu na úkor jiné, a to i jen s nepatrným rozdílem, mohou mít obrovské důsledky výkonu. Klíčem k úspěchu je použít index, ignorovat kompaktní kód, ignorovat obávat opakování kód, musíte provést dobrý spuštění dotazu plán (pouze index).

Přečtěte si to a vzít v úvahu všechny metody. Váš nejlepší metoda bude záviset na vašich parametrů, vaše data, vaše schématu a skutečného využití:

Dynamické hledání Podmínky v T-SQL podle podle Erland Sommarskog

Prokletí a Požehnání dynamické SQL by Erland Sommarskog

to bude produkovat nejlepší provedení plánu:

IF @flag=1
BEGIN
    SELECT
        [field]
        FROM [table]
        WHERE col1 = @value
END
ELSE
BEGIN
    SELECT
        [field]
        FROM [table]
        WHERE col2 = @different_value
END

Nicméně, pokud budete mít jediného dotazu, to je vaše nejlepší sázka na použití indexu

SELECT
    [field]
    FROM [table]
    WHERE @flag=1
        AND col1 = @value
UNION ALL
SELECT
    [field]
    FROM [table]
    WHERE @flag!=1
        AND col2 = @different_value
Odpovězeno 15/07/2010 v 15:56
zdroj uživatelem

hlasů
0

Dalo by se také použít boolean logiku:

SELECT blah FROM myTable WHERE (@i IS NULL OR AnotherCondition)
Odpovězeno 15/07/2010 v 15:56
zdroj uživatelem

hlasů
0

Co takhle jednoduše;

WHERE
  (@flag = 1 AND col1 = @value)
OR
  (@flag = 2 AND col2 = @different_value)
...
Odpovězeno 15/07/2010 v 15:57
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more