2009-06-05 5 views
11

私はLINQでこのような何かを書くことができます:おそらくT-SQL SELECTでインサイクル変数を定義できますか(LINQのLETなど)?

SELECT @Initials 
FROM [Person] 
SET @Initials = SUBSTRING (Person.FirstName, 1, 1) + SUBSTRING (Person.LastName, 1, 1) 

ませんが、おそらくトリックがある:

var selection = from person in personList 
       let initials = person.FirstName[0] + person.LastName[0] 
       select initials; 

は、私は多分のように、SQLと似た何かを行うことができますか?

極端な複雑さとコードの繰り返しを避けるために、複雑なWHERE節でさらに使用するために事前計算された変数が必要です。

+2

タグに 't-sql'を使用しないでください。代わりに 'tsql'を使用してください。あなたの質問にタグを付ける際のプロンプトプロンプトに注意してください。おそらく名前を避けてください。 –

+0

なぜですか? 「T-SQL」は通常は使用されますが、TSQLは使用されません。 – User

+0

@ MasterMind、残念ながら、より多くの人々が歴史的にtsqlを使用していました。 –

答えて

12

一時テーブル、ループなどを追加せずにこれを行うには、Common Table Expression(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がビューのようなデータベースに保存されていない、ストアドプロシージャ、一時テーブル、

+0

はNULLケースをテストする必要があります – van

+2

OPは「複雑なWHERE句でさらに使用するために事前計算された変数を持つ必要があります」と言っています。その質問から、1回の結果セットを返すだけでなく、変数に結果を格納したいように見えます。そうでなければ、これは良い答えです、そうでなければ彼らは私の答えをチェックアウトする必要があります... –

+2

-1これは私が彼を理解している場合、これはオペアンプが求めているものではありません。 – JoshBerke

2
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 
3

あなたはちょうど後で変数の頭文字を取得しようとしているように見えます。あなたが単一の値をセットとしてそれを使用しようとしていない場合

DECLARE @Initials varchar(2) 

SELECT @Initials = SUBSTRING (Person.FirstName, 1, 1) + SUBSTRING (Person.LastName, 1, 1) 
FROM [Person] 
WHERE .... 

...このようにそれを試してみてください、あなたは他の複雑なクエリでサブクエリまたはCTEをやって見なければなりません。

-1

あなたが複数回使用するイニシャルのセットを維持する、またはより大きなクエリの一部として、次の操作を実行したい場合:

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多くの行を行っている場合。また、tempテーブルを使用するよりも大きなクエリでこれを派生テーブルにするほうが速いでしょう。

+0

OP変数のクエリがイニシャルだけでフィルタリングすると、テーブル変数がパフォーマンスを大幅に低下させる可能性があります。ほとんどの場合、基礎となる表の索引を使用するため、CTEは優れています(表変数は使用しません)。 – richardtallent

+0

@richardtallent、質問&私の答えをお読みください!私は「あなたがイニシャルを複数回使用するようにしたいのなら」と言った。 OPの質問からも、彼は結果を変数に入れようとしています。あなたはCTEでそれをすることはできません。私は唯一の別のタイプのソリューションを提案していた! –

関連する問題