我有一个SQL查询,它使用CASE .. WHEN语句根据其他字段的值创建别名字段。
SELECT
ID,
CASE
WHEN LEN(LastName) = 0 THEN FirstName
END AS DisplayName
FROM MyTable
结果SELECT语句通常包含别名DisplayName
的“重复”。我知道它们并不是真正的重复,因为ID字段是唯一的。如果我不关心与哪个ID相关联,如何获取DisplayName
的DISTINCT列表?由于Logical Operator Precedence的顺序,我无法在DisplayName
语句中使用GROUP BY
别名。
更新 - 我应该提到我确实需要取回ID,只要该ID与其中一个重复项(第一个,最后一个等)相关联。
答案 0 :(得分:1)
SELECT
MAX(ID) [ID],
DisplayName
FROM (
SELECT
ID,
CASE
WHEN LEN(LastName) = 0 THEN FirstName
END AS DisplayName
FROM MyTable
) a
GROUP BY DisplayName
答案 1 :(得分:1)
我假设逻辑是你想要姓氏(如果有的话),否则就是名字。这不完全是您的查询所做的。
只需使用case
语句聚合:
SELECT MIN(ID) as id
(CASE WHEN LEN(LastName) = 0 THEN FirstName ELSE LastName END) AS DisplayName
FROM MyTable
GROUP BY (CASE WHEN LEN(LastName) = 0 THEN FirstName ELSE LastName END);
如果您将空值存储为NULL
而不是''
,则可以更简单地将其写为:
SELECT MIN(ID) as id
COALESCE(LastName, FirstName) AS DisplayName
FROM MyTable
GROUP BY COALESCE(LastName, FirstName) ;
答案 2 :(得分:0)
with x as (
SELECT
ID,
CASE
WHEN LEN(LastName) = 0 THEN FirstName
END AS DisplayName
FROM MyTable)
select distinct id, displayname from x
如果您更喜欢使用cte
,这是一种方法。
答案 3 :(得分:0)
如果您想GROUP BY
别名,那么您需要使用嵌套查询。
SELECT MAX(t.ID), t.DisplayName FROM (
SELECT
ID,
CASE WHEN LEN(LastName) = 0 THEN FirstName END AS 'DisplayName'
FROM MyTable) as t
GROUP BY t.DisplayName
由于您必须返回一个ID,并且您不关心返回哪个ID,只需返回MAX
一个。只要您有一个聚合您的ID的功能,例如MAX
或MIN
,您就可以按DisplayName进行分组。
答案 4 :(得分:0)
您可以使用Row_Number()OVER()并选择第一个实例。我不确定你是否打算在CASE WHEN中排除ELSE语句,但是如果姓氏的长度为0,它将返回第一个名称,否则返回NULL。
SELECT ID,DisplayName
FROM
(
SELECT
Row_Number() OVER(PARTITION BY CASE
WHEN LEN(LastName) = 0 THEN FirstName
END
ORDER BY CASE
WHEN LEN(LastName) = 0 THEN FirstName
END
) RowID,
ID,
CASE
WHEN LEN(LastName) = 0 THEN FirstName
END AS DisplayName
FROM MyTable
) a
WHERE RowID = 1