0

この「1/12/45」のようにフォーマットされた祖先のリストを保持する祖先列を持つテーブルがあります。1はルート、12は1の子などです。

祖先リストで特定のノード/番号を持つすべてのレコードを見つける必要があります。そうするために、私はこのSQLステートメントを書きました:

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

次のエラーステートメントが表示されます:演算子が存在しません:integer = text

私もこれを試しました:

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

ただし、祖先フィールドに1が含まれるレコードのみが返されます。たとえば1/12/45を持っているものではありません

どうしたの?

ありがとう!

4

3 に答える 3

2

LIKEこれは、ではなく、の仕事のように聞こえINます。

この値を任意の位置で検索すると仮定した場合、次のことを試してみてください。

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

文字列連結の正確な構文はSQL製品によって異なることに注意してください。ancestryリストの最初/最後の項目を中間の項目と異なる方法で処理する必要がないように、列の先頭と先頭に追加していることに注意してください。1また、をsで囲んでいるため、たとえばwithや。/の誤った一致が発生しないことにも注意してください。/51//12/

于 2012-04-10T07:17:18.837 に答える
0

MySQLでは次のように書くことができます。

SELECT * FROM nodes
WHERE ancestry = '1' 
   OR LEFT(ancestry, 2) = '1/'
   OR RIGHT(ancestry, 2) = '/1'
   OR INSTR(ancestry, '/1/') > 0
于 2012-04-10T07:17:03.237 に答える
0

in演算子は、コンマ区切りの値のリスト、またはクエリ結果を期待します。つまり、次のようになります。

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

また:

... in (select id from SomeOtherTable)

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

祖先リストで文字列'1'を検索するだけで、文字列内で検索されるため、誤検知が発生します'2/12/45''/1/'両方の文字列の最初と最後にセパレータを追加して、次のような文字列のような文字列を探す必要があります'/1/12/45/'

select * from nodes
where charindex('/' + convert(varchar(50), 1) + '/', '/' + nodes.ancestry + '/') <> 0
于 2012-04-10T07:21:46.853 に答える