2016-08-05 4 views
1

これは私の現在のSELECT文です:今selectステートメントの1つの列の値を使用して結合の列を表示する方法はありますか。

SELECT DISTINCT [QVD/CSV Names] AS 'CSV/Excel Files', 
       [SourceTypeID], 
       CASE 
        WHEN substring([QVD/CSV Names], len([QVD/CSV Names]) - 3, 4) = '.csv' THEN 'CSV' 
        WHEN substring([QVD/CSV Names], len([QVD/CSV Names]) - 3, 4) = '.xls' THEN 'Excel' 
        WHEN substring([QVD/CSV Names], len([QVD/CSV Names]) - 4, 5) = '.xlsx' THEN 'Excel' 
       END 
       AS [Source Types] 
FROM STG_QVDs 
LEFT OUTER JOIN SourceTypes AS c 
    ON [Source Types] = c.[SourceTypeName] 
WHERE [QVD/CSV Names] IS NOT NULL 
    AND substring([QVD/CSV Names], len([QVD/CSV Names]) - 3, 4) <> '.qvd' 

、私は3つの列があります。 1つの列には、ファイル名CSV/Excel Filesが表示されます。もう1つは、ソースのID(case文を使用して別の列のその場で生成しています)を表示することです。列はデータベースにないので、そこに作成する必要がありました。これが私が立ち往生した場所です。私は[Source Types]列を表示したくありません。私はちょうどCSV/Excel FilesSourceTypeIDがほしいです。生成された列を使用して行の適切なIDを表示できる方法はありますか?

これは、SourceTypesルックアップテーブルを調べる方法です。

SourceTypeID SourceTypeName 
------------ -------------- 
     1    CSV 
     2    Excel 

これは、表示される内容である:

CSV/Excel Files Source Types 
--------------- ------------ 
    file1.csv   CSV 
    file2.xls   Excel 

私はディスプレイにそれをしたい:それは、列の別名を参照しようとしているため

CSV/Excel Files SourceTypeID 
--------------- ------------ 
    file1.csv   1 
    file2.xls   2 
+0

これはどのSQLですか? SQLite? MySQL? –

+0

私は、サンプルデータと望みの結果が本当にあなたがしたいことを説明するのに役立つと思います。列を表示しない場合は、列を削除するだけです。 –

+0

@ ObinnaNwakwue、申し訳ありません、私は今それをタグ付けしました。それはSQL Serverです。 – Leon

答えて

1

CIP(Common Table Expression)で最初にCSV/Excelの値を準備してからルックアップテーブルに参加させることができます。このようなもの。

;with names as (-- start CTE 
SELECT DISTINCT [QVD/CSV Names] AS [CSV/Excel Files], 
       CASE --"ends with" 
        WHEN [QVD/CSV Names] like '%.csv' THEN 'CSV' 
        WHEN [QVD/CSV Names] like '%.xls' THEN 'Excel' 
        WHEN [QVD/CSV Names] like '%.xlsx' THEN 'Excel' 
       END 
       AS [Source Types] 
FROM STG_QVDs 
WHERE [QVD/CSV Names] IS NOT NULL 
    AND [QVD/CSV Names] not like '%.qvd' 
) --end CTE 
select names.[CSV/Excel Files], c.[SourceTypeID] 
from names 
LEFT OUTER JOIN SourceTypes AS c 
    ON names.[Source Types] = c.[SourceTypeName] 
+0

ありがとう!私はあなたの解決策の修正版を持って行きました。 – Leon

0

あなたのコードは、動作しません。 ON節。つまり、テーブルの1つに[Source Types]がすでに定義されていると、コンパイルと実行が行われる可能性があります。コードはおそらくあなたが意図したことをしません。

私はあなたが意図だと思う:

SELECT DISTINCT [QVD/CSV Names] AS [CSV/Excel Files], 
       [SourceTypeID], 
FROM STG_QVDs LEFT OUTER JOIN 
    SourceTypes c 
    ON [QVD/CSV Names] LIKE '%.' + c.[SourceTypeName] 
WHERE [QVD/CSV Names] IS NOT NULL AND 
     [QVD/CSV Names] NOT LIKE '%.qvd'; 

注:SELECT DISTINCTが疑わしいです。それはまったく必要ないかもしれません。

+0

Gotcha、私は今これを試してみましょう。ありがとう。 – Leon

+0

ファイルタイプが '.xls'または '.xlsx'の場合は、うまく機能しません。 – Leon

+0

この回答は完璧ですが、エイリアスのエイリアスと使用の本能はスマートです。コードを読みやすくするためです。派生テーブルまたはCTEを作成し、その列にエイリアスを使用し、派生テーブル/ CTEの外部にエイリアスを使用すると、エイリアスを使用して参照できます。 – paulbarbin

関連する問題