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]