J'ai une requête qui utilise une WHERE
clause, et il se trouve que j'utilise exactement la même WHERE
clause dans de nombreuses requêtes sur cette table (et al).
La requête est:
SELECT
DATENAME(DW, [AtDateTime]) AS [Day of Week]
,COUNT(*) AS [Number of Searches]
,CAST(CAST(COUNT(*) AS DECIMAL(10, 2))
/ COUNT(DISTINCT CONVERT(DATE, [AtDateTime])) AS DECIMAL(10, 2))
AS [Average Searches per Day]
,SUM(CASE WHEN [NumFound] = 0 THEN 1 ELSE 0 END)
AS [Number of Searches with no Results]
,CAST(CAST(SUM(CASE WHEN [NumFound] = 0 THEN 1 ELSE 0 END)
AS DECIMAL(10, 2)) / COUNT(*) AS DECIMAL(10, 4))
AS [Percent of Searches with no Results]
FROM [DB].[dbo].[SearchHistory]
WHERE
[CustomerNumber] <> '1234' AND [CustomerNumber] <> '5678'
GROUP BY DATENAME(DW, [AtDateTime]), DATEPART(DW, [AtDateTime])
ORDER BY DATEPART(DW, [AtDateTime])
La partie que je souhaite modifier est la WHERE
clause, pour me permettre d'utiliser un tableau afin que si je dois ajouter un numéro de client à ignorer, je n'ai pas à mettre à jour toutes mes requêtes. (Et il y a pas mal de requêtes qui ont cette même WHERE
clause.)
sql-server
sql-server-2012
t-sql
where
Der Kommissar
la source
la source
Réponses:
Créez un tableau pour contenir les numéros de client à exclure, puis excluez ces lignes à l'aide d'un
NOT EXISTS
dans laWHERE
clause.la source
Maintenant, votre
WHERE
clause dans toutes les requêtes devient:la source
Il y a des questions importantes / des problèmes potentiels avec votre approche proposée. Bien sûr, vous pouvez exclure assez facilement via une table de travail «exclusion du numéro client»:
Mais maintenant, quels étaient les "paramètres de requête" - entièrement dynamiques et indépendants, par requête et par utilisateur - se transforment en "état persistant partagé dans la base de données".
Quelques questions et points pertinents:
les informations d'exclusion de client doivent-elles être distinctes, par utilisateur ou par session? vous pouvez ajouter un paramètre 'SessionID' pour les distinguer, mais vous recréez essentiellement un ancien modèle de "table de travail".
peut-être qu'une clause NOT IN (...) pourrait être préférable? qui peut être paramétré dynamiquement, jusqu'à la limite de 2100 paramètres.
revisitez peut-être votre code / infrastructure pour créer des paramètres de requêtes et de liaisons, si vous comptez actuellement sur des numéros de paramètres fixes; l'amélioration de ceci permettra la modularité et l'utilisation d'une clause IN ou NOT IN (?,?,? ..) avec un nombre variable de paramètres.
Approche suggérée:
Avec les liaisons '1234', '5678', '6789', etc. aux paramètres NOT IN () et aux paramètres de requête logique ultérieurs liés dynamiquement à la numérotation appropriée.
la source