Puisque vous avez balisé ce que sql-server, je vais supposer que vous êtes à la recherche des recommandations du côté de la base de données, par opposition à la façon de le faire dans le front- fin.
Ma recommandation est: Normaliser. Si un ZoneCode appartient à une ville particulière, alors vous devriez avoir une table de villes et une table de ZoneCodes, avec votre table de client (ou n'importe quelle table a ces colonnes maintenant) faisant référence à un ZoneCodeID
.
schéma Exemple:
CREATE TABLE Cities
(
CityID int NOT NULL IDENTITY(1, 1)
CONSTRAINT PK_Cities PRIMARY KEY CLUSTERED,
CityName varchar(100) NOT NULL
)
CREATE INDEX IX_Cities_Name
ON Cities (CityName)
CREATE TABLE ZoneCodes
(
ZoneCodeID int NOT NULL IDENTITY(1, 1)
CONSTRAINT PK_ZoneCodes PRIMARY KEY CLUSTERED,
CityID int NOT NULL
CONSTRAINT FK_ZoneCodes_Cities FOREIGN KEY
REFERENCES Cities (CityID)
ON UPDATE NO ACTION,
ON DELETE NO ACTION
ZoneCode varchar(10) NOT NULL
)
CREATE INDEX IX_ZoneCodes_City
ON ZoneCodes (CityID)
INCLUDE (ZoneCode)
Pour filtrer c'est aussi simple que:
SELECT ZoneCodeID, ZoneCode
FROM ZoneCodes
WHERE (@CityID IS NULL) OR (CityID = @CityID)
Ou, si vous avez seulement le nom:
SELECT z.ZoneCodeID, z.ZoneCode
FROM ZoneCodes z
INNER JOIN Cities c
ON c.CityID = z.CityID
WHERE (@CityName IS NULL) OR (CityName = @CityName)
Si vous ne pouvez pas faites cela - c'est-à-dire parce que ce sont des données de forme libre, ou parce que les personnes de saisie de données peuvent w la ville, mais pas le ZoneCode, etc., alors tout ce que je peux suggérer, est de vous assurer que vous êtes indexé correctement:
CREATE INDEX IX_MyTable_City_ZoneCode
ON MyTable (City)
INCLUDE (ZoneCode)
Ensuite, votre filtre doit être:
SELECT DISTINCT ZoneCode
FROM MyTable
WHERE (@City IS NULL) OR (City = @City)
... à obtenir les ZoneCodes pour une ville, et:
SELECT FirstColumn, SecondColumn, ...
FROM MyTable
WHERE ((@City IS NULL) OR (City = @City))
AND ((@ZoneCode IS NULL) OR (ZoneCode = @ZoneCode))
Coalesce! Cela fonctionne parfaitement! Y a-t-il un désavantage en utilisant la coalescence? –
En supposant que vous avez un index, vous finirez avec un balayage d'index au lieu d'une recherche d'index. C'est pourquoi vous devriez normaliser. – Aaronaught
'@Artur Carvalho': Ce n'est pas sargable, c'est-à-dire que l'index ne peut pas être utilisé pour chercher quand l'expression est dans' COALESCE'. Cela nécessitera un scan complet de la table ce qui est bien si vous n'avez pas d'index composite, mais sera plus lent si vous en avez un. Dans ce dernier cas, la première requête sera plus rapide. – Quassnoi