2012-02-27 7 views
2

私はStudentというテーブルを以下のようなレコードを持っています。ユーザーが指定した列名に基づいたクエリ

StudentId int PK NOT Null, 
Name Varchar(50), 
Age int, 
DateofBirth Datetime and 
ClassRecordID int NOT NULL 
MajorID int NOT NULL 

、データは次のようになります。

StudentID Name  Age Dateofbirth ClassRecordID MajorID 
1234  Sam  21  1/10/1991  1122   1 
1235  NULL  Null 1/12/1990  1123   2 
1236  George Null NULL    1125   2 
1237  Fanny  NULL NULL    1155   1 

私の要件は、ユーザーがcolumnNameMajorIDを提供するたびに、クエリがいるテーブルからclassRecordIDを返す必要があり、

ですcolumnNameにはnull値または空の値があります。例えば

ユーザがcolumnName = 'Age'MajorId = 2を提供する場合、

は、クエリは、ユーザがcolumnName = 'Dateofbirth'MajorId = 2を提供する場合、クエリは1125

を返す必要があり、同様に1123と1125

を返すべき

次のクエリを使用して試しました。

Declare @ColumnName nvarchar(50) 
Delcare @MajorId int 

set @ColumnName = 'age' --for example 
set @MajorId = 2 -- For example 

SELECT DISTINCT TOP 10 
    ClassRecordID 
FROM 
    dbo.Student WITH (NOLOCK) 
WHERE 
    (@ColumnName IS NULL 
    OR LEN(LTRIM(RTRIM(@ColumnName))) = 0) 
    AND 
    MajorId = @MajorId 

しかし、期待される結果の代わりに空を返します。このクエリで何が問題になっていますか?これを行うための良い方法はありますか?私はIF elseアプローチを使用したくありません。

答えて

1

私はこのテクニックは、あなたが求める一つだと思い:

SELECT DISTINCT TOP 10 
    ClassRecordID 
FROM 
    dbo.Student WITH (NOLOCK) 
WHERE 
    1 = CASE WHEN @ColumnName = 'Age' THEN 
      CASE WHEN Age IS NULL THEN 1 ELSE 0 END 
     ELSE CASE WHEN @ColumnName = 'DateofBirth' THEN 
      CASE WHEN DateOfBirth IS NULL THEN 1 ELSE 0 END 
     END      
AND MajorId = @MajorId 
+0

私はこの解決策を試しましたが、Yuriyのアプローチによって提供される柔軟性は私には提供されません。提案していただきありがとうございます。 – user1072578

+1

ようこそ。動的SQLアプローチを採用する前に、この記事を参照してください。http://www.sommarskog.se/dynamic_sql.htmlそれがあなたの状況に適しているかどうかを判断することができます。 –

+0

確かにロン、私はそれを見ています。 – user1072578

2

あなたが本当にあなたのコードの新しい列が追加されるたびに拡張することなく、任意の列でフィルタリングすることができるようにしたい場合は、あなたが使用することができます動的SQLとsp_executesqlです。このコードスニペットはうまくいくはずです:

declare @nullFilterColumnName varchar(50) 
set @nullFilterColumnName = 'Age' 

declare @majorId int 
set @majorId = 2 

declare @sql nvarchar(max) 
set @sql = 'select distinct ClassRecordID from Students where isnull(' 
    + quotename(@nullFilterColumnName) 
    + ', '''') = '''' and MajorId = ' 
    + cast(@majorId as nvarchar(20)) 
exec sp_executesql @sql 

最後の手段としてこのオプションを使用することをお勧めします。 @ron tornambeのバージョンはより堅牢です。

+0

私はこれを答えにします。ゆりありがとうございました。 – user1072578

+0

うれしい私はあなたを助けることができます。この回答を受け入れるといいでしょう([FAQ](http://stackoverflow.com/faq#howtoask)参照)。 –

+1

名前の ']'は2回繰り返すことでエスケープする必要があります(例えば '[X [1]'のような名前は '[X [1]]'としてクエリ内で参照されます)。名前を角かっこで囲むだけでは十分ではありません。 ']'が存在するかどうかわからない場合は、['QUOTENAME()'](http://msdn.microsoft.com/en-us/library/ms176114.aspx "QUOTENAME(Transact- SQL) ")、安全な側にいるだけです。それは名前を区切り、必要に応じてエスケープを追加します。つまり、 '' ... ['+ @name +'] ... 'の代わりに '' ... '+ QUOTENAME(@name)+' ... ''を使用します。 –

関連する問題