Што з'яўляецца эквівалентам функцыі ў SQLite для FIND_IN_SET (значэнне, набор) у MySQL?

Прыклад ніжэй w.r.t MySQL. Для, напрыклад: test1 выглядае наступным чынам

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

выберыце * ад test1 дзе FIND_IN_SET ( '122', імя)

будзе о/р наступным чынам:

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

У Sql Lite, выкарыстоўваючы, як гэта будзе выглядаць так:

select * 
from `test1` 
where name like '%,122,%'
or name like '122,%'
or name like '%,122'
or name = '122'
<�Р> Выпадак: </р>

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, крыніца
Хто дадаў FIND_IN_SET у MySQL варта корм размаўляе.
дададзена аўтар mu is too short, крыніца
Вы можаце выкарыстоўваць LIKE : stackoverflow.com/questions/6979813/…
дададзена аўтар John Weldon, крыніца
Я не разумею ваш каментар?
дададзена аўтар John Weldon, крыніца
Тып дадзеных «імя» радок. @John шкада. Я хачу пазбегнуць як, але калі няма лепшага рашэння, я пайду да яго.
дададзена аўтар Angelin Nadar, крыніца
Iam збіраецца для вырашэння stackoverflow.com/questions/6979813/... як я не патрабую індэкса
дададзена аўтар Angelin Nadar, крыніца
Я не магу пайсці на рашэнне becoz іншага забытага выпадку, калі маё значэнне не толькі 551.122. Як мы будзем звяртацца з гэтым? Мы можам падзяліць & цыкл па & выкарыстоўваць індывідуальна для 122 & 551 асобна
дададзена аўтар Angelin Nadar, крыніца

3 адказы

Мая першая ідэя складаецца ў тым, што вы не павінны захоўваць дадзеныя ў фармаце CSV ў калонцы ў рэляцыйнай базе дадзеных, вы павінны выкарыстоўваць асобную табліцу асацыяцыі.

Вы можаце зрабіць гэтую працу з LIKE, хоць. Ваш каментар паказвае на тое, што вы бачыце тры выпадкі, але ёсць на самой справе чатыры:

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

Індэкс можа быць выкарыстаны для апошняга выпадку і, магчыма, першым, але дзве сярэдніх, верагодна, будуць сканаваннем табліцы. Вы можаце спрасціць запыт, калі вы прымушаеце вашы дадзеныя заўсёды маюць пачатковыя і канчатковыя коскай:

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

Затым вы можаце выкарыстоўваць толькі адзін LIKE (які не будзе выкарыстоўваць індэкс):

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

Але вы сапраўды павінны выкарыстоўваць табліцу асацыяцыі, так што вы можаце выкарыстоўваць , дзе імя = 122 і далучыцца да іншых табліцах для астатнія.

4
дададзена
Вы таксама не павінны называць слупок «імя» CSV ... Калі імя чыіх-то/нешта не на самай справе «1,2». Можа быць, гэта база дадзеных кібернетычных істот з Star Trek.
дададзена аўтар Flimzy, крыніца
+1 не павінен захоўваць дадзеныя ў фармаце CSV ў калонцы ў рэляцыйнай базе дадзеных чаму вы хочаце, каб зэканоміць месца ў табліцы, захоўваючы ў CSV?
дададзена аўтар Deeptechtons, крыніца
@Angelin: Гэта цікавы падыход, але вы ўсё роўна павінны выправіць вашу схему і выкарыстоўваць табліцу асацыяцыі.
дададзена аўтар mu is too short, крыніца
@Angelin: Вы не можаце капіяваць дадзеныя ў табліцу асацыяцыі і выкарыстоўваць, што замест гэтага?
дададзена аўтар mu is too short, крыніца
@mu занадта кароткае Замест таго, каб прымушаць вашы дадзеныя заўсёды маюць пачатковыя і завяршальныя коскай вы можаце прайсці праз Джон Уэлдан спасылку і выкарыстоўваць ( «» || column_name || «») LIKE "%, значэнне,%" і дзякуючы для забытага выпадку але тое апрацоўваецца згаданым рашэннем
дададзена аўтар Angelin Nadar, крыніца
@mu занадта кароткае: я, але я не магу cahnge схемы ў якасці базы дадзеных трэцяй боку
дададзена аўтар Angelin Nadar, крыніца
Добра можа даць яму паспрабаваць, але, як апошні прыярытэт, як і шукае для некаторых радковых функцый, якія могуць апрацоўваць яго ці убудаваныя функцыі, як падганяюць у FIND_IN_SET() даступныя ў MySQL
дададзена аўтар Angelin Nadar, крыніца

Я аддаю перавагу ісці з тактыкай, згаданай Джон Уэлдан,

Такім чынам,

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
дададзена