Un de mes développeurs fait valoir que COALESCE(column, default value) = default value
c'est désormais discutable. Est-ce correct?
J'ai exécuté le test suivant, et je pense que cela implique que ce COALESCE
n'est pas discutable.
USE tempdb;
SELECT @@VERSION;
-- Microsoft SQL Server 2016 (RTM-CU3-GDR) (KB3194717) - 13.0.2186.6 (X64) Oct 31 2016 18:27:32 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows 10 Pro 6.3 <X64> (Build 14393: ) (Hypervisor)
CREATE TABLE Test
(
ID int primary key clustered,
Mod6 int null,
INDEX IX_Mod6 NONCLUSTERED (Mod6)
);
INSERT INTO Test (ID, Mod6)
SELECT object_id as ID, case when name like '%k%' then null else object_id % 6 end as Mod6
FROM sys.objects;
SELECT Mod6
FROM Test WITH (INDEX = IX_Mod6, FORCESEEK)
where Mod6 is null or Mod6 = 0;
-- Plan shows expected seek
SELECT Mod6
FROM Test WITH (INDEX = IX_Mod6, FORCESEEK)
WHERE COALESCE(Mod6, 0) = 0;
-- Error:
-- Msg 8622, Level 16, State 1, Line 20
-- Query processor could not produce a query plan because of the hints
-- defined in this query. Resubmit the query without specifying any hints
-- and without using SET FORCEPLAN.
CASE
expression - pas que le résultat de l'expression ne puisse pas ensuite être utilisé pour rechercher autre chose.COALESCE
colonne d.Réponses:
Non
COALESCE
n'est pas discutable.Votre propre test le démontre bien.
Une exception serait si vous créez une colonne calculée avec l'
COALESCE
expression et l'indexez.Vous pourriez vous retrouver avec une recherche sur ce
ISNULL
est légèrement plus discutable dans la mesure où s'il est totalement redondant, il peut être optimisé et ne pas empêcher une recherche.c'est-à-dire que si la colonne
Mod6
est définie commeNOT NULL
alors, ce qui suit peut produire une recherche.Mais cela, bien sûr, n'apporte aucun avantage par rapport à simplement faire
la source