MySQLのfind_in_set(value、set)のsqliteの同等の機能は何ですか?

以下の例はMySQLの場合です。 例えば:test1は以下の通りです

+----+------------------------+
| id | name                   |
+----+------------------------+
|  2 | 1,2                    |
| 33 | 2,44,33,5              |
|  1 | 11,4,55                |
| 12 | 11,111,122,551,112,221 |
+----+------------------------+

選択* test1 から where find_in_set( '122'、name)

o/pは次のようになります:

+----+------------------------+
| id | name                   |
+----+------------------------+
| 12 | 11,111,122,551,112,221 |
+----+------------------------+

In Sql Lite, using like it would be:

select * 
from `test1` 
where name like '%,122,%'
or name like '122,%'
or name like '%,122'
or name = '122'

A case:

My value is 551,122. In this case,as value is returned from appln we can split the value column & write the query as

(',' || column_name || ',') LIKE '%,551,%' or
(',' || column_name || ',') LIKE '%,122,%'

これを処理する最良のアイデアですか?

私は好きにならないようにしたい。それで他のアイデアは?

0
あなたがしたいことは、あなたのスキーマを変更することなく、純粋なSQLiteで行うことができるとは思いません。サードパーティ製のSQLiteアドオンがあり、配列データ型で必要な機能を実行することができます。また、独自の関数を記述して必要な処理を行うこともできます。
追加された 著者 Flimzy,
@muistooshort:ああ本当ですか?私はどこかでそれを参照していたと誓っていたかもしれません...おそらくアドオンとして?あるいは、私はそれを夢見ていたかもしれない。
追加された 著者 Flimzy,
@Flimzy:SQLiteは配列をサポートしていません。
追加された 著者 mu is too short,
MySQLに find_in_set を追加した人は誰かと話をしなければなりません。
追加された 著者 mu is too short,
あなたは LIKE を使うことができます: stackoverflow.com/questions/6979813/…
追加された 著者 John Weldon,
私はあなたのコメントを理解していないのですか?
追加された 著者 John Weldon,
'name'のデータ型は文字列です。 @ジョンは申し訳ありません。私は好きにならないようにしたいですが、もっと良い解決策がなければ、私はそれに行きます。
追加された 著者 Angelin Nadar,
私はインデックスを必要としないので、私はstackoverflow.com/questions/6979813/...解決に行く
追加された 著者 Angelin Nadar,
私の価値が551,122だけではない場合、私は別の忘れた事件の解決策becozに行くことができません。私たちはこれをどのように扱いますか? 122&551を別々に分割&ループ&分割することができます
追加された 著者 Angelin Nadar,

3 答え

私の最初の考えは、リレーショナルデータベースの列にCSVデータを格納すべきではないということです。別の関連テーブルを使用する必要があります。

あなたはLIKEでこの作業を行うことができます。あなたのコメントは、あなたが3つのケースを見ることを示していますが、実際には4つあります:

select *
from test1
where name like '122,%'
   or name like '%,122'
   or name like '%,122,%'
   or name    = '122'     /* You forgot about this degenerate case */

インデックスは最後のケースで使用され、おそらく最初のもので使用されますが、中間の2つはおそらくテーブルスキャンです。データに常に先頭と末尾のカンマを付けるようにすると、クエリを簡素化できます。

+----+--------------------------+
| id | name                     |
+----+--------------------------+
|  2 | ,1,2,                    |
| 33 | ,2,44,33,5,              |
|  1 | ,11,4,55,                |
| 12 | ,11,111,122,551,112,221, |
+----+--------------------------+

次に、LIKE(インデックスを使用しない)を1つだけ使用できます。

select *
from test1
where name like '%,122,%'

しかし、実際には where name = 122 を使用して残りのテーブルに参加できるように関連テーブルを使用するべきです。

4
追加された
また、CSV列に「名前」という名前を付けるべきではありません。誰かの名前が実際には「1,2」でない限り。多分、それはStar Trekのサイバネティックな生き物のデータベースです。
追加された 著者 Flimzy,
+1 はリレーショナルデータベースの列にCSVデータを格納しませんなぜCSVとして格納することでテーブルのスペースを節約したいですか?
追加された 著者 Deeptechtons,
@Angelin:興味深いアプローチですが、スキーマを修正して関連テーブルを使用する必要があります。
追加された 著者 mu is too short,
@Angelin:データを関連テーブルにコピーして代わりに使用することはできませんか?
追加された 著者 mu is too short,
@muが短すぎるデータを常に先頭と末尾のコンマで区切るのではなく、John Weldonリンク&使用( '、' column_name || '、')LIKE '%、value、%'&ありがとう忘れた場合は、上記の解決策で処理されたもの
追加された 著者 Angelin Nadar,
@ムが短すぎる:ああ、私はサードパーティのデータベースとしてスキーマをcahngeすることはできません
追加された 著者 Angelin Nadar,
OKを試すことができますが、MySQLで使用可能なfind_in_set()のようなカスタマイズ関数として構築された、いくつかの文字列関数を探していることを最後の優先事項としています
追加された 著者 Angelin Nadar,

私は、ジョン・ウェルドン(John Weldon)

そう、

select *
from test1
where (',' || column_name || ',') LIKE '%,122,%' //any value 

リファレンス

0
追加された

関数を作成する

public class ConnectionOpenHandler extends Interceptor{
  private static final long serialVersionUID=1;
  private String nameConnection;
  private String jdbcUrl;

  public void handler(Handler handler) throws Exception{
    Context context=(Context)handler.getProperty("context");
    SessionContext sessionContext=(SessionContext)context;

    Class.forName("org.sqlite.JDBC");
    Connection connection=DriverManager.getConnection(jdbcUrl);
    connection.setAutoCommit(false);
    handler.setProperty(nameConnection,connection);
    sessionContext.getProtectedContext().setProperty(nameConnection,connection);

    Function.create(connection,"find_in_set",new FindInSet());
  }
  private class FindInSet extends Function{
    protected void xFunc() throws SQLException{
      String row=this.value_text(0);
      String values=this.value_text(1);

      if(values==null){
        result(0);
        return;
      }

      boolean ok=Arrays.asList(values.split("\\,")).contains(row);
      result(ok?1:0);
    }
  }
}
0
追加された