Sql 如何使用select语句中一列的值来显示联接中的列?

Sql 如何使用select语句中一列的值来显示联接中的列?,sql,sql-server,Sql,Sql Server,这是我当前的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' WHE

这是我当前的
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    Source Types
---------------    ------------
   file1.csv          CSV
   file2.xls          Excel
我希望它显示:

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

您的代码将无法工作,因为它试图引用
ON
子句中的列别名。如果其中一个表中已经定义了
[源代码类型]
,那么它可能会编译并运行;但是代码可能不会达到您的目的

我认为你打算:

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
可疑。您可能根本不需要它。

您可以先在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]

这是哪种SQL?SQLite?MySQL?我认为示例数据和期望的结果将真正有助于解释您想要做什么。如果不想显示该列,请将其删除。@ObinnaNwakwue,对不起,我现在给它加了标签。这是SQL Server。当文件类型为“.xls”或“.xlsx”时,它不起作用。这个答案很好,但您使用别名的本能是聪明的,因为它可以使代码更易于阅读。您可以创建派生表或CTE,使用该列的别名,然后在派生表/CTE之外,您可以使用别名引用它。谢谢!我最终选择了你的解决方案的修改版本。
;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]