2012-04-10 19 views
0

私は、このように書式化された祖先のリストを保持する列の祖先を持つテーブルを持っています。 1はルート、12は1の子など...sql in節が機能しません

祖先リストに特定のノード/番号を持つすべてのレコードを見つける必要があります。私は、エラーステートメントの次の取得

select * from nodes where 1 in (nodes.ancestry) 

:そうするために、私は、このSQL文を書いたオペレータが存在しません:整数=テキスト

私もこれを試してみました:

select * from nodes where '1' in (nodes.ancestry) 

それ祖先フィールドに1を持つレコードのみを返します。例えば1/12/45のものではない

何が問題なのですか?

ありがとうございます!

+2

あなたは 'in'がための正しい道具だったと思い作ったものこの仕事?あるいは、あなたの 'ancestry'カラムを解釈する方法を魔法のように知っているでしょうか? –

+0

テーブルを再設計する可能性がある場合は、すべきです。構造化された情報をそのような文字列に保つことはお勧めできず、あらゆる種類の問題に遭遇します。 – barsju

答えて

2

をこれはLIKE、ないINのための仕事のように聞こえます。

私たちは、あなたが任意の位置でこの値を検索するとし、その後、我々は試す可能性がある場合:文字列の連結のための正確な構文はSQL製品の間で変化すること

select * from nodes where '/' + nodes.ancestry + '/' like '%/1/%' 

注意を。私が前にして、ancestry列に追加しているので、リスト内の最初/最後の項目を中間項目とは異なる方法で扱う必要はありません。 1/と囲んでいるため、たとえば/51/または/12/となります。

+0

'1 /'とマッチさせる必要がある場合、彼は正規表現マッチを必要とするかもしれません。 – barsju

+0

こんにちはDamien、あなたの解決策は私が知るまで使っていたものですが、何かクリーナーを使いたいと思っていました。 INは明らかに私には見えましたが、それは明らかに明らかではありません... – ndemoreau

+0

完全性のために:Postgresでは、これは次のようになります:select * from nodes where '/' || nodes.ancestry || '/'/'のように'%/ 1 /% ' – ndemoreau

0

MySQLでは、あなたは書くことができます:

SELECT * FROM nodes 
WHERE ancestry = '1' 
    OR LEFT(ancestry, 2) = '1/' 
    OR RIGHT(ancestry, 2) = '/1' 
    OR INSTR(ancestry, '/1/') > 0 
0

inオペレータはすなわち、値のカンマ区切りリスト、またはクエリ結果を期待:

... in (1,2,3,4,5) 

か:

... in (select id from SomeOtherTable) 

をあなたがする必要がどのように文字列を作成することですあなたは他の文字列でそれを探すことができます。

祖先リスト内の文字列'1'を探してみると、文字列'2/12/45'にあるように誤検出が起こります。あなたは'/1/12/45/'のような文字列で'/1/'のような文字列を探すように、最初と両方の文字列の末尾に区切りを追加する必要があります。

select * from nodes 
where charindex('/' + convert(varchar(50), 1) + '/', '/' + nodes.ancestry + '/') <> 0 
+0

私もこれを試してみました:select * from(node(node.ancestry、'/'、'、 ')を置き換えます)' 1 'のノードからは同じ結果が得られます – ndemoreau

+0

@ndemoreau: 'in'演算子を使って別の文字列の文字列を探すことはできません。 'in'演算子を使いたい場合は、文字列' '1/12/45 'を一時テーブルの3つのレコードに分割する必要があります。これは本当に遅い解決策です。 – Guffa

+0

私はそれを理解しますが、IN演算子を使用してカンマ区切りリストに整数を探すことはできません。これはうまくいくはずです!それじゃない? – ndemoreau

関連する問題