MSSQL - определите имя столбца в операторе SELECT и используйте его в предложении WHERE - PullRequest
8 голосов
/ 20 декабря 2010

есть ли способ использовать определенное имя столбца в операторе SELECT с предложением WHERE?Вот мои t-sql коды,

SELECT CONVERT(DATETIME,(
    CASE WHEN Operator = 'T' THEN 
        (SUBSTRING(SendDate,7,4)+'-'+SUBSTRING(SendDate,4,2)+'-'+ 
        SUBSTRING(SendDate,1,2) + SUBSTRING(SendDate,11,9)) 
    ELSE 
        RecivedSMS.SendDate 
    END)) AS DefinedDate 
WHERE DATEPART(wk, DefinedDate) =  52

Ваши ласковые и большое спасибо за вашу помощь, уже сейчас.

Отредактированная часть размещена

CREATE TABLE #TEMP
(
DateField DATETIME,
NumberField VARCHAR(10),
Sender VARCHAR(255)
)

INSERT #TEMP
SELECT DISTINCT(
CONVERT(DATETIME, ( 
                    CASE WHEN Operator = 'T' 
                    THEN (  SUBSTRING( SendDate, 7, 4 ) + '-'
                            + SUBSTRING( SendDate, 4, 2 ) + '-'
                            + SUBSTRING( SendDate, 1, 2 )
                            + SUBSTRING( SendDate, 11, 9 )
                         ) 
                    ELSE SendDate 
                    END))) AS Table1.DateField,

SUBSTRING(Table1.Message,7,7) AS NumberField

FROM Table1
INNER JOIN 
Table2 ON Table1.Sender = Table2.PhoneNumber,
(
          SELECT  CONVERT(DATETIME, ( 
                    CASE WHEN Operator = 'T' 
                    THEN (  SUBSTRING( SendDate, 7, 4 ) + '-'
                            + SUBSTRING( SendDate, 4, 2 ) + '-'
                            + SUBSTRING( SendDate, 1, 2 )
                            + SUBSTRING( SendDate, 11, 9 )
                         ) 
                    ELSE SendDate 
                    END)) AS DefinedDate 
          FROM    Table1 WHERE Table1.Operator IS NOT NULL
        ) q  
WHERE Operator IS NOT NULL AND SUBSTRING(Table1.Message,1,6) = 'TREE ST'  AND DATEPART( wk, q.DefinedDate ) =  52 AND DATEPART(year, q.DefinedDate ) = 2010


SELECT *  FROM #TEMP ORDER BY NumberField

DROP TABLE #TEMP

1 Ответ

9 голосов
/ 20 декабря 2010

Не напрямую, но вы можете заключить его в подвыбор.

Оператор SQL

    SELECT  *
    FROM    (
              SELECT  CONVERT(DATETIME, ( 
                        CASE WHEN Operator = 'T' 
                        THEN (  SUBSTRING( SendDate, 7, 4 ) + '-'
                                + SUBSTRING( SendDate, 4, 2 ) + '-'
                                + SUBSTRING( SendDate, 1, 2 )
                                + SUBSTRING( SendDate, 11, 9 )
                             ) 
                        ELSE RecivedSMS.SendDate 
                        END)) AS DefinedDate 
              FROM    YourTable
            ) q          
    WHERE   DATEPART( wk, DefinedDate ) =  52

update

Я считаю, что следующеебудет эквивалентно тому, что вы написали:

SELECT  q.DefinedDate
        , q.NumberField
FROM    (
          SELECT  Sender
                  , NumberField = SUBSTRING(Table1.Message, 7, 7) 
                  , Operator
                  , CONVERT(
                      DATETIME
                      , ( 
                          CASE WHEN Operator = 'T' 
                          THEN SUBSTRING( SendDate, 7, 4 ) + '-'
                               + SUBSTRING( SendDate, 4, 2 ) + '-'
                               + SUBSTRING( SendDate, 1, 2 )
                               + SUBSTRING( SendDate, 11, 9 )
                          ELSE SendDate 
                          END )) AS DefinedDate 
          FROM    Table1 WHERE Table1.Operator IS NOT NULL
        ) q  
        INNER JOIN Table2 ON Table2.PhoneNumber = Tabl1.Sender
WHERE   q.NumberField LIKE 'TREE ST%'  
        AND DATEPART( wk, q.DefinedDate ) =  52 
        AND DATEPART( year, q.DefinedDate ) = 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...