2017-09-01 51 views
0

我有一种情况中提到了一个名为列在那里我使用了一个名为列如:的SQLite从另一列

SELECT title, SUBSTR(title, 1, 2) as nameprefix FROM employees 

现在的问题是,我想补充另一个名为列,并以某种方式引用其中的nameprefix。这可能吗?基本上我想这样做:

SELECT title, SUBSTR(title, 1, 2) as nameprefix, 
(CASE WHEN nameprefix = 'Dr' THEN 'FOUND' ELSE 'NOPE' END) as flag 
FROM employees 

它抱怨错误:Error: no such column: nameprefix。实际的用例涉及复杂的子查询,我希望能够重复使用它们的结果,而不是在需要结果的每列中复制这些子查询。

+0

使用CTE或子查询。 –

回答

0

听起来您希望查看表格,就好像title字段的前两个字符被视为单独的名称d栏。因此,我会使用CREATE VIEW来构建该视图,然后对其进行查询,而不是针对底层表。

所以,你的情况,问题像

CREATE VIEW EmployeesWithCols (Name, Title, NamePrefix) AS 
    SELECT Name, Title, SUBSTR(title, 1, 2) FROM Employee 

现在,只需用employeeswithcols替换表employee在原始查询,你会奇迹般地有一个新的NamePrefix列可用。当然,您可能还需要在视图中添加一些其他列。

作为一个方面说明,我通常命名的视图仅用于将虚拟计算列添加到具有表名和前缀“Ex”(根据许多内部Windows函数)的单个表中,但在这种情况下以及其他许多如果您对编写视图名称的字母大小写不严格,那么命名惯例已经成熟为尴尬。

+0

我认为一个观点其实可能就是我所追求的。我现在将探讨这些问题 - 如果这些视图基于的原始表中的数据发生变化,它们是否总是'最新',将查询它始终返回可靠的结果? – strangetimes

+0

是的,一个视图只是一个存储的查询,在任何时候在另一个查询中引用该查询。除了基础表以外,视图中的数据没有单独的存储空间,根据定义,内容在读取时是准确和最新的。如果视图定义是“昂贵”来评估依赖查询的性能可能会受到影响,但在这种使用视图来将虚拟,廉价计算列添加到单个表的情况下,您应该看到很少或根本没有性能效果。 –

+0

谢谢!所以我现在正在探索意见,但我认为我想做的事可能不可能。正在变成命名列的子查询实际上是查询在同一个表上运行以提取额外的信息。员工也可以是另一位员工的经理,为了提取这种“亲子关系”,我需要在同一张桌子上执行子查询,并将单独的信息提取为单独的命名列。这也许不能变成一个视图,至少我不知道如何。 – strangetimes

0

您可以使用别名在选择,你必须重复代码

SELECT title, SUBSTR(title, 1, 2) as nameprefix, 
CASE WHEN SUBSTR(title, 1, 2)= 'Dr' THEN 'FOUND' ELSE 'NOPE' END as flag 
FROM employees 
使用

子选择如:在加入

SELECT title, t.nameprefix , 
CASE WHEN nameprefix = 'Dr' THEN 'FOUND' ELSE 'NOPE' END as flag 
FROM employees 
JOIN (select id, SUBSTR(title, 1, 2) as nameprefix 
      FROM employees) t on t.id = employees.id 
+0

是的,我已经这样做了,遗憾的是,由于我使用的是复杂的子查询,它最终重新查询数据库多次,似乎是瓶颈 – strangetimes

+1

如果您需要创建视图或子查询表 – scaisEdge

1

这是可能的:

select title, nameprefix from 
(
    select title, SUBSTR(title, 1, 2) as nameprefix FROM employees 
) 
where nameprefix = 'Dr' 
+0

Won不工作 - 我需要使用另一个命名列内的命名列 – strangetimes

+0

这是我能想到的时候有人想要使用命名列的唯一方式...我认为您应该尝试使您的查询符合使用这些更简单和更具可读性的功能......我敢肯定,如果你提供更多关于你想要做什么的细节,那会更好 – Moher