我可以用LINQ写这样的东西:
var selection = from person in personList
let initials = person.FirstName[0] + person.LastName[0]
select initials;
我可以用SQL做类似的事情,比如:
SELECT @Initials
FROM [Person]
SET @Initials = SUBSTRING (Person.FirstName, 1, 1) + SUBSTRING (Person.LastName, 1, 1)
可能不是,但也许有一个伎俩?
我需要有一个预先计算的变量,以便在复杂的WHERE子句中进一步使用,以避免极端复杂性和代码重复。
在不添加临时表,循环等的情况下执行此操作的干净方法将使用公用表表达式(CTE)。例:
;WITH PersonsWithInitials AS
(
SELECT
SUBSTRING (COALESCE(Person.FirstName,''), 1, 1)
+ SUBSTRING (COALESCE(Person.LastName,''), 1, 1) AS Initials,
FirstName,
LastName,
City
FROM
[Person]
)
SELECT
FirstName,
LastName,
City,
Initials
FROM
PersonsWithInitials
WHERE
/* Complex WHERE clause goes here and it can reference Initials as if it were a field */
代替上面的空“”,您可以使用句号或其他内容代替空名称字段。
这应该都是在.NET的单个SQL调用中执行的 - CTE不会像视图,存储过程,临时表等一样保存在数据库中。
看起来你只是想把首字母变成一个变量供以后使用。试试这种方式......
DECLARE @Initials varchar(2)
SELECT @Initials = SUBSTRING (Person.FirstName, 1, 1) + SUBSTRING (Person.LastName, 1, 1)
FROM [Person]
WHERE ....
如果您尝试将其用作集合而不是单个值,则应该查看使用其他复杂查询执行子查询或CTE。
SELECT Initials
= SUBSTRING (Person.FirstName, 1, 1)
+ SUBSTRING (Person.LastName, 1, 1)
FROM [Person]
要么
SELECT SUBSTRING (Person.FirstName, 1, 1)
+ SUBSTRING (Person.LastName, 1, 1)
AS Initials
FROM [Person]
如果以后需要使用它,一个清晰可读的方法是使用公共表exprssion(可以堆叠,而不是嵌套):
WITH Person2 AS (
SELECT SUBSTRING (Person.FirstName, 1, 1)
+ SUBSTRING (Person.LastName, 1, 1)
AS Initials
FROM [Person]
)
SELECT Initials, COUNT(*) AS Record_Count
FROM Person2
GROUP BY Initials
如果要保留一组首字母以便多次使用,或者作为较大查询的一部分,请执行以下操作:
declare @TableVariable table (Initials varchar(200)
INSERT INTO @TableVariable
(Initials)
SELECT
ISNULL(SUBSTRING(Person.FirstName,1,1),'')+ISNULL(SUBSTRING(Person.LastName,1,1),'')
FROM Person
SELECT * FROM @TableVariable
SELECT * FROM @TableVariable
如果你做了很多行#temp表更快。此外,在比使用临时表更大的查询中使这个派生表更快可能会更快。