2016-06-25 11 views
0

テーブルがあるとします。 このテーブルには、各学生コードの列(varchar)があります。 私が設定したフィルタに基づいて多くの学生を検索したい。SQLサーバーのwhere句の置換

たとえば、000012,000014,000058のように、ユーザーが コードをコンマで区切って挿入する質問フィールド(varchar)があります。そう私は置き換える機能REPLACE(CHAR(39)+'000012,000014,000058'+CHAR(39),',',CHAR(39)+','+CHAR(39)) を使用して('000012','000014','000058')

質問欄が私を返すこと'000012,000014,000058' のような値がSQLクエリは、質問欄に Select * from Students where code in ('000012,000014,000058')

その方法を実装して、私は、値を変更する必要がありますこれを試してください

Select * 
from students 
where code in (REPLACE(CHAR(39)+'000012,000014,000058'+CHAR(39),',',CHAR(39)+','+CHAR(39))) 

まだ動作しません。

すべてのアイデア?

+0

私が正しく理解していれば、唯一の問題は投稿データです。したがって、クエリとIF 'code'フィールドが数値の前に' ''を何も置き換えないと、あなたのクエリはうまくいく '(000012,000014,000058)のコードになります。これはもちろん、回避策です。 –

+0

mayde私は明確ではなかった。私のdbは適切に設計されています。 各レコードのコード列には1つの値しかありません。 ユーザーは、フロントエンドの質問フィールドに、学生に関する情報を表示するために、カンマで区切られた学生のコードを0001200058と入力します。 私はSQLクエリを選択する必要があります*どこからコードが( '00012'、 '00058') – Dimitris

+0

@JorgeCamposはい、コードが数字であればそれは良いです しかし、コード列はvarcharです – Dimitris

答えて

1

REPLACE(...は文字列を返します。必要なものはテーブルのようなものです。文字列(varchar)をテーブルに分割する方法はたくさんあります。これはただの1つです。

declare @ids varchar(100)='000012,000014,000058' 
declare @x xml='<x>'+replace(@ids,',','</x><x>')+'</x>' 
select * from students 
where code in (
select t.x.value('.[1]','varchar(10)') 
from @x.nodes('x') t(x) 
) 
+0

コードのリストがユーザから提供されている場合は、5つの特別なxml文字をエスケープ(htmlエンコード)することができます: '&><'" ' – gordy

0

JPWが言うように、セル内にカンマ区切りの値を有する第1正規形に違反し、そのクエリにSQLの能力は、すでに弱体化されています。このような場合にできることは、最初に通常の形式に戻ってから通常どおりに処理します。

SQL Server 2016を使用している場合は、クロス適用でstring_splitを使用してセルを行に戻します(here's a backwards compatible string_split for earlier versions)。 :あなたは2016を持っていないとstring_split機能を追加したくない場合は

select s.* from students s cross apply string_split(code, ',') 
where value in ('000012','000014','000058') 

は..alternatively、あなたはそうのようなアレックスの答えのように.nodesを使用することができます。

select s.* from students s cross apply 
(select convert(xml, '<x>' + replace(code, ',', '</x><x>') + '</x>')) a(code_xml) 
cross apply code_xml.nodes('*') x(n) 
where n.value('.','varchar(20)') in ('000012','000014','000058') 

- - 編集---

データベースセルにカンマで区切られた値が含まれていないことがコメントで分かりました。この場合はAlexの答えが適切です。