Мне нужен SQL-запрос, чтобы найти все слова, которые можно составить из набора букв, включая до двух пустых плиток.

В настоящее время у меня есть таблица базы данных, называемая словарем, со следующими полями для всех записей словаря:

public static final String COLUMN_NAME_UID = "_id_";
public static final String COLUMN_NAME_WORD = "word";
public static final String COLUMN_NAME_WORD = "wordSorted";
public static final String COLUMN_NAME_WORD_LENGTH = "length";
public static final String COLUMN_NAME_COUNT_A = "count_A";
public static final String COLUMN_NAME_COUNT_B = "count_B";
public static final String COLUMN_NAME_COUNT_C = "count_C";
public static final String COLUMN_NAME_COUNT_D = "count_D";
public static final String COLUMN_NAME_COUNT_E = "count_E";
public static final String COLUMN_NAME_COUNT_F = "count_F";
public static final String COLUMN_NAME_COUNT_G = "count_G";
public static final String COLUMN_NAME_COUNT_H = "count_H";
public static final String COLUMN_NAME_COUNT_I = "count_I";
public static final String COLUMN_NAME_COUNT_J = "count_J";
public static final String COLUMN_NAME_COUNT_K = "count_K";
public static final String COLUMN_NAME_COUNT_L = "count_L";
public static final String COLUMN_NAME_COUNT_M = "count_M";
public static final String COLUMN_NAME_COUNT_N = "count_N";
public static final String COLUMN_NAME_COUNT_O = "count_O";
public static final String COLUMN_NAME_COUNT_P = "count_P";
public static final String COLUMN_NAME_COUNT_Q = "count_Q";
public static final String COLUMN_NAME_COUNT_R = "count_R";
public static final String COLUMN_NAME_COUNT_S = "count_S";
public static final String COLUMN_NAME_COUNT_T = "count_T";
public static final String COLUMN_NAME_COUNT_U = "count_U";
public static final String COLUMN_NAME_COUNT_V = "count_V";
public static final String COLUMN_NAME_COUNT_W = "count_W";
public static final String COLUMN_NAME_COUNT_X = "count_X";
public static final String COLUMN_NAME_COUNT_Y = "count_Y";
public static final String COLUMN_NAME_COUNT_Z = "count_Z";

Я хочу иметь возможность искать instance test* и находить все слова, которые можно составить из «t», «e», «s», «t» и подстановочного знака, например такие слова, как «tests» (s — это подстановочный знак) , «setts» (s — подстановочный знак), «set», «tet» «es», «te», «best» (b — подстановочный знак) и т. д. Все, что вы можете сделать с любой комбинацией этих букв.

Я пробовал такие методы, но этот пример находит только четыре буквы без подстановочного знака:

SELECT * FROM dictionary WHERE 

count_E=1 AND
count_S=1 AND
count_T=2 

SELECT * FROM dictionary WHERE  length <=4

Это производит:

"137075"    "sett"  "estt"
"145808"    "stet"  "estt"
"153675"    "test"  "estt"
"153851"    "tets"  "estt"

Теперь, я знаю, это своего рода скрытая математическая задача в глубине души.

Вот как я могу получить все слова из 5 букв с одним пробелом и всеми буквами, указанными в последнем запросе:

SELECT * FROM dictionary WHERE 

count_E=1 AND
count_S=1 AND
count_T=2 

INTERSECT 
SELECT * FROM dictionary WHERE  length <=5

Полученные результаты:

"97705"     "netts" "enstt"
"137075"    "sett"  "estt"
"145250"    "state" "aestt"
"145808"    "stet"  "estt"
"152303"    "taste" "aestt"
"152333"    "tates" "aestt"
"152632"    "teats" "aestt"
"153361"    "tents" "enstt"
"153675"    "test"  "estt"
"153676"    "testa" "aestt"
"153733"    "testy" "estty"
"153769"    "teths" "ehstt"
"153851"    "tets"  "estt"
"153874"    "texts" "esttx"
"156575"    "totes" "eostt"
"157952"    "trets" "erstt"
"172060"    "yetts" "estty"

Однако мне пришлось бы пройти через все итерации комбинаций букв, чтобы получить все скрытые подслова... Может ли кто-нибудь помочь мне придумать более элегантный подход к поиску анаграмм и подслов из запроса и выше к двум подстановочным знакам? Я также знаю, что вы можете использовать REGEXP в SQL, так что это может быть способом. На данный момент я не знаю, и я несу эту проблему в улей...

Есть ли запрос или серия запросов, пересечения, соединения и т. д., которые помогли бы мне решить эту проблему?

ОБНОВЛЕНИЕ Думаю, я наткнулся на это, но не уверен, что оно работает правильно. Любая помощь будет оценена по достоинству:

SELECT * FROM dictionary WHERE 
(
count_E<=1 AND
count_S<=1 AND
count_T<=1 
)
INTERSECT SELECT * FROM dictionary WHERE length =(count_E+count_S+count_T+1)     ORDER BY length

+1 должен учитывать одно пустое место. Для двух я думаю просто сделать +2 и т. д. +0 будут просто эти буквы и все, что вы можете сделать из них.


person Joshua Michael Waggoner    schedule 10.07.2015    source источник
comment
Я не думаю, что вы можете использовать REGEXP в sqlite.   -  person Kristy Welsh    schedule 10.07.2015
comment
Да, ты можешь. Я пробовал, и это работает. В моем SQLiteBrowser работает команда REGEXP :)   -  person Joshua Michael Waggoner    schedule 10.07.2015


Ответы (1)


необходимо выполнить следующее, собрать конкатенацию всех полей таблицы следующим образом:

concatenacion = "(_id||' '||Desc_art||' '||Nom_proveedor||' '||marca) like '"+resultado+"'" +
            "OR (_id||' '||Nom_proveedor||' '||marca||' '||Desc_art) like '"+resultado+"'" +
            "OR (marca||' '||Nom_proveedor||' '||Desc_art||' '||_id) like '"+resultado+"'" +
            "OR (marca||' '||Nom_proveedor||' '||_id||' '||Desc_art) like '"+resultado+"'" +
            "OR (Desc_art||' '||Nom_proveedor||' '||marca||' '||_id) like '"+resultado+"'" +
            "OR (Desc_art||' '||_id||' '||Nom_proveedor||' '||marca) like '"+resultado+"'";

Затем сделайте свой запрос и в предложении WHERE должны указать свою конекатенацию, например:

cursor=bd.rawQuery("select _id, Desc_art, cant_art, Desc_bulto, precio"+getDefaultNroLista(codcliente)+", tiene_imagen,marca from listas_precios where "+concatenacion+" ORDER BY Desc_art ASC", null);

Я работаю очень хорошо для меня, надеюсь, что это служит

person Gonzalo GM    schedule 10.07.2015
comment
эти переменные, например, вам придется адаптировать это к вашей проблеме. Привет - person Gonzalo GM; 12.07.2015