2013-07-15 5 views
2

У меня есть запрос, который извлекает только два столбца и выравнивает один из столбцов только с именем носителя. Это запрос, для этого:Поиск в базе данных SQL Server с подстрокой

Select 
    [Object], 
    CASE WHEN MsgID = '61' THEN SUBSTRING(Parms,35,6) END AS [MEDIA] 
    from JnlDataSection 

Результаты от этого:

 
Object 
--------- 
061 STATEMENTS 

MEDIA 
--------- 
X01180 
X01181 

Как вы можете видеть, что есть несколько Medias для одного объекта. Я хочу, это ручной запрос, в котором я могу просто изменить его с именем объекта и искать один объект со всеми его соответствующими медиа и наоборот.

Это запрос, я придумал:

Select 
    [Object], 
    CASE WHEN MsgID = '61' THEN SUBSTRING(Parms,35,6) END AS [MEDIA] 
    WHERE [OBJECT] = '061 STATEMENTS' 
    from JnlDataSection 

Однако я получаю эту ошибку:

Msg 156, Level 15, State 1, Line 5 
Incorrect syntax near the keyword 'from'. 

Пожалуйста, обратите внимание: Я использую SQL Server Management Studio 2008.

ОБНОВЛЕНИЕ

После прочтения comme NTS, я попробовал этот запрос:

Select 
    [Object], 
    CASE WHEN MsgID = '61' THEN SUBSTRING(Parms,35,6) END AS [MEDIA] 
from JnlDataSection 
WHERE [MEDIA] = 'X05219' 

Он дал мне эту ошибку:

Msg 207, Level 16, State 1, Line 5 
Invalid column name 'MEDIA'. 

Как я могу это исправить?

+3

Порядок статей должен быть 'SELECT ... FROM ... WHERE ... GROUP BY. ..HAVING ... ORDER BY'.У вас есть 'WHERE' перед вашим' FROM'. – JNK

+0

Выберите [Object], случая, когда MsgID = '61' THEN подстроки (Parms, 35,6) END AS [MEDIA] из JnlDataSection WHERE [MEDIA] = 'X05219' –

+0

@JNK Я получаю эту ошибку, когда я попробуйте запустить это. Msg 207, уровень 16, состояние 1, строка 5 Недопустимое имя столбца 'MEDIA'. –

ответ

1

Для расширения @JNK's suggestion, если вы хотите сравнить с вычисленным MEDIA колонки, вот ваши варианты:

  1. Воспроизведите выражение CASE в предложении WHERE:

    SELECT 
        [Object], 
        CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END AS [MEDIA] 
    FROM JnlDataSection 
    WHERE CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END = 'X05219' 
    ; 
    
  2. Redefine запрос в качестве common table expression:

    WITH JnlDataSectionMedia AS (
        SELECT 
        [Object], 
        CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END AS [MEDIA] 
        FROM JnlDataSection 
    ) 
    SELECT * 
    FROM JnlDataSectionMedia 
    WHERE [MEDIA] = 'X05219' 
    ; 
    

    или (нормальный) подвыборкой:

    SELECT * 
    FROM (
        SELECT 
        [Object], 
        CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END AS [MEDIA] 
        FROM JnlDataSection 
    ) AS s 
    WHERE [MEDIA] = 'X05219' 
    ; 
    
  3. Использование CROSS APPLY:

    SELECT 
        j.[Object], 
        x.[MEDIA] 
    FROM JnlDataSection AS j 
    CROSS APPLY (
        SELECT CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END 
    ) AS x ([MEDIA]) 
    WHERE x.[MEDIA] = 'X05219' 
    ; 
    
  4. Вы также можете задать свой запрос как view:

    CREATE VIEW JnlDataSectionMedia 
    AS 
    SELECT 
        [Object], 
        CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END AS [MEDIA] 
    FROM JnlDataSection 
    ; 
    

    После этого, вы может позвонить в любое время:

    SELECT [Object], [MEDIA] 
    FROM JnlDataSectionMedia 
    ; 
    

    Вы можете фильтровать по любой из колонок тоже, когда необходимо:

    SELECT [Object], [MEDIA] 
    FROM JnlDataSectionMedia 
    WHERE [MEDIA] = 'X05219' 
    ; 
    
+0

Благодарим за помощь, я решил эту проблему. У меня возникают проблемы с чем-то другим в отношении этого же запроса, если вы можете взглянуть, пожалуйста. http://stackoverflow.com/questions/17658995/output-of-empty-columns-in-sql-query –

Смежные вопросы