这是我目前的SELECT
声明:
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'
现在,我有三列。一列将显示文件名CSV/Excel Files
。另一个是假设显示源的ID(我使用case语句在另一列中的现场生成)。由于该列不在数据库中,我不得不在那里创建它,这就是我被困住的地方。我不想显示[Source Types]
列。我只想要CSV/Excel Files
和SourceTypeID
。有没有办法让我能够使用生成的列显示行的相应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 :(得分:1)
您可以先在CTE(公用表表达式)中准备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]
答案 1 :(得分:0)
您的代码无效,因为它会尝试在ON
子句中引用列别名。好吧,如果已在其中一个表中定义[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
是可疑的。你可能根本不需要它。