2011-11-08 6 views
1

私にはdeclare @a varchar(100) = 'abc bcd cde def'があります。私が必要とするのは、カラムが 'abc'や 'bcd'や 'cde'や 'def'のようなテーブルから選択することです。私は分割機能とwhileを使って私が望むものを得ることができますが、どこかでreplaceなどのスマートなソリューションを見て、覚えていないことがあります。T-SQL分割文字列のような文節

私はxml変数を使用して、そのように解析することができます。しかし、この値は大規模な手続きの一部であり、私にとって最良の方法は文字列形式で使用することです。

は、私は、動的SQLクエリを構築することにより、この問題を解決することができます知っているが、それは私が働いているドメインではオプションではありません。あなたは、パターンを使用することができますTSQLで

+0

私はスプリットを除く他のソリューションを参照してくださいカント... –

+0

あなたはhttp://stackoverflow.com/questions/2647/split-string-in-sqlを探しているか、あなたはトラブル 'INをやってを持っています'分割の結果に? –

+0

解決策、xmlデータ型、dinamycクエリ、私が必要とするものを探しているだけのトンがあります。 –

答えて

1

くそー、私は解決策を思い出すことができます。そのハック、仕事を行う少し汚いトリック。

とにかく、私はコードを使用します(Im over SQL Server 2008)、良い考えですか?私は汚れた割れ目よりも好きです。それはより効果的ですか?

declare @w varchar(100) = 'some word' 
declare @f xml 

set @f = '<word>' + replace(@w, ' ', '</word><word>') + '</word>' 

select 
    template.item.value('.', 'varchar(100)') as word 
from @f.nodes('/word') template(item) 
+0

テストして参照してください。理解できない結果が得られた場合は、別の質問をしてください。 – MatBailie

0

col like '[abcd]'

http://msdn.microsoft.com/en-us/library/ms179859.aspx

複数の単語(文字ではない)と動的SQLが一致しない場合は、値を一時表に取得する必要があります。分割関数の場合は、このページhttp://www.sommarskog.se/arrays-in-sql-2005.html#iterativeを試して、文字列関数のリストiter_charlist_to_tableを見てください。

または、おそらくあなたはこの小さなトリックをSO CEOのParameterize an SQL IN clauseと考えています。

+0

申し訳ありません、私の更新が見えますか? –

+0

注:これは個々の文字に一致します。単語を一致させたい場合、これはうまくいかないでしょう。 – MatBailie

+0

あなたはそれを釘付けにしたと思います。私は深く見てみましょう。感謝します。あなたの汚いXMLベースのテクニックについてどう思いますか? –

0

個々のアイテムをテーブルに分割する機能を使用します。アイテムごとに1つのレコードです。次に、そのテーブルに単純に参加します。

insert into #FilterTable (filters) 
select Items from dbo.Split(@YourFilterString) 

select * 
    from YourTable yt 
    join #FilterTable f on f.filters = yt.YourColumn 

もちろん、私の例では等価を使用しています。本当にワイルドカードで「好き」を使うつもりなら、それはもっと複雑になります。

0

4用のセクション最大

WHERE 
    PARSENAME(REPLACE(@a, ' ', '.'), 1) = 'xxx' 
    OR 
    PARSENAME(REPLACE(@a, ' ', '.'), 2) = 'xxx' 
    OR 
    PARSENAME(REPLACE(@a, ' ', '.'), 3) = 'xxx' 
    OR 
    PARSENAME(REPLACE(@a, ' ', '.'), 4) = 'xxx'