2010-04-01 5 views
4

Puis-je nommer une colonne personnalisée dans l'instruction SELECT et la référencer dans la clause WHERE sans dupliquer le code?Utilisez une colonne personnalisée nommée dans SQL 2005 dans la clause WHERE?

Par exemple;

SELECT RIGHT(REPLICATE('0', 5) + RTRIM(SOME_ID)), 5) AS DISPLAY_ID 
FROM dbo.MY_TABLE 
WHERE DISPLAY_ID LIKE '%005%' 

Seulement beaucoup plus compliqué. Je veux maintenir ce code à un seul endroit mais SQL Server 2005 me force à dupliquer le SELECT personnalisé dans la clause WHERE.

je crois que cela est possible dans Microsoft SQL Server 2000, mais plus en 2005.

Merci.

+0

Qu'est-ce qu'une "colonne personnalisée", et ce qui est l'autre type appelé? –

+0

Je doute que ce soit le terme accepté. Je veux juste dire une colonne sur laquelle j'effectue une manipulation avant de retourner les données. –

Répondre

6

Vous pouvez le faire en utilisant soit un SUB SELECT ou une fonction CTE

SELECT * 
FROm (
      SELECT RIGHT(REPLICATE('0', 5) + RTRIM(SOME_ID), 5) AS DISPLAY_ID 
      FROM MY_TABLE 
     ) sub 
WHERE DISPLAY_ID LIKE '%005%' 

OU

;WITH Tbl AS(
     SELECT RIGHT(REPLICATE('0', 5) + RTRIM(SOME_ID), 5) AS DISPLAY_ID 
     FROM MY_TABLE 
) 
SELECT * 
FROM Tbl 
WHERE DISPLAY_ID LIKE '%005%' 

L'une des fois que je suis au courant de ce que vous peut utiliser l'alias de colonne, est lorsque vous souhaitez ORDER BY alias colonne.

EDIT:

Plusieurs blocs CTE

DECLARE @MY_TABLE TABLE(
     SOME_ID INT 
) 

DECLARE @Your_TABLE TABLE(
     SOME_ID INT 
) 

;WITH Table1 AS(
     SELECT * 
     FROM @MY_TABLE 
), 
Table2 AS(
     SELECT * 
     FROM @Your_TABLE 
) 
SELECT * 
FROM Table1 t1 INNER JOIN 
     Table2 t2 ON t1.SOME_ID = t2.SOME_ID 
+0

Merci aussi. SUB SELECT a travaillé. –

+0

Attention à imbriquer vos sous-groupes trop profondément. Cela pourrait non seulement vous dégrader les performances, mais aussi le rendre très difficile à maintenir. Pensez aux tables temp/var, ou plutôt aux requêtes cte ... –

+0

Je ne connais pas les CTE et je n'ai besoin que d'un SUB SELECT dans ce cas. Bien que, regardant la documentation, il semble que les CTE soient la voie à suivre. Pourrait nettoyer mon code un peu aussi. –

2

Vous pouvez envelopper l'aide d'un subselect un nettoyant, comme peu ceci:

SELECT DISPLAY_ID 
FROM (SELECT RIGHT(REPLICATE('0', 5) + RTRIM(SOME_ID)), 5) AS DISPLAY_ID 
     FROM dbo.MY_TABLE) SubTable 
WHERE DISPLAY_ID LIKE '%005%' 
+0

Ceci est un SELECT déjà massif. Va-t-il l'emballer dans une autre performance d'impact? –

+0

@Orange Kid: l'utilisation d'une sous-requête garantira une autre analyse de la table - tandis que la duplication, l'exécution d'une requête n'effectuera qu'une seule analyse de la table, ce qui la rendra plus performante. –

+0

@OMG Ponies - Woops, été en oracle trop longtemps, fixe. –