[SQL] Trudne zapytanie select

0

Mam problem,
w tabeli są dwie kolumny, i czasami jedna kolumna przechowuje kilka słów po przecinku np:

słowo1, słowo2, słowo3

innym razem ta sama kolumna przechowuje tylko jeden wyraz np:

słowo5

pytanie brzmi: jak się odnieść do danego wiersza za pomocą tylko slowa2 albo slowa1 ?

Oto przykład zapytania, które zwraca wynik, tylko wtedy gdy podam wszystkie trzy słowa czyli całą zawartość kolumny:

  string Zapytanie = "SELECT * FROM slownik WHERE pol LIKE @pol";
            
            SqlCeCommand Polecenie = new SqlCeCommand(Zapytanie, con);
            
            Polecenie.Parameters.Add("@pol", textBox1.Text);

jak wpiszę w TextBox tylko jedno z słów np: slowo3 to wynik zapytania nic nie zwraca :-(

Proszę o pomoc, sugestie, albo gdzie szukać rozwiązania

0

Może pomyśl najpierw o normalizacji bd, bo z tego co pisze Twoja baza danych nawet nie jest w I postaci normalnej.

0

Nie mam pojęcia jak się zabrać do normalizacji...poza tym musiałbym przebudować jeszcze inne rzeczy :-(
hmm.. ale też nie da się tu zrobić normalizacji tak na prawdę, bo jest to po prostu słownik i w każdym wierszu jest wartość kolumny "pol" i wartość kolumny "ang" a często się zdarza że jakieś słówko ma kilka tłumaczeń właśnie po przecinku..

Wiem że są zapytania w SQL opierające się na kombinacji różnych znaków specjalnych, za pomocą których wystarczy wpisanie jednego wyrazu z np. trzech wyrazów, a i tak odnajdzie cały wiersz i pięknie wyświetli :-)

Przykładowo, mam słówko "ARM" które posiada kilka tłumaczeń na język polski: konar, broń, ręka, ramię, herb, poręcz, odnoga tłumacząc z języka polskiego na angielski chciałbym wpisać tylko słowo ręka a funkcja SQL powinna wyszukać ten ciąg znaków i wyświetlić angielskie słówko , gdybym normalizował tę bazę to zrobiło by się duo więcej słówek o tych samych angielskich tłumaczeniach..bez sensu :-)

0
SELECT * FROM user.tablela WHERE kolumna like '%slowo1%';
0

koziołek - dokładnie o to mi chodziło !!

ale niestety nie zadziała to z parametrem

 string Zapytanie = "SELECT * FROM slownik WHERE pol LIKE '%@pol%'";

jak się nazywają takie funkcje ??

0

string Zapytanie = "SELECT * FROM slownik WHERE pol LIKE '%"+@pol+"%'";

Niestety cała konstrukcja nie jest najlepsza bo te zapytanie będzie zwracać również wynik dla słowa którego częścią jest warunek. Np. dla słowa 'but' zwróci 'but', 'butik', 'szkorbut' itp.

0

AdamPl- '%" + @pol + "%'

" The name 'pol' does not exist in the current context "

po dodaniu cudzysłów '%" +" @pol" + "%' , kompiluje się ale nic nie zwraca zapytanie

0

a nie powinno być coś w stylu (znalezione w starym podręczniku do Visual Basica):

SELECT * FROM user.tabela WHERE kolumna like '%" & @param & "%';
0

hmm.. ale też nie da się tu zrobić normalizacji tak na prawdę, bo jest to po prostu słownik i w każdym wierszu jest wartość kolumny "pol" i wartość kolumny "ang" a często się zdarza że jakieś słówko ma kilka tłumaczeń właśnie po przecinku.

Da się normalizacje bez problemu przeprowadzić, tylko pytanie czy to ma sens ze względu na wydajność.

0

Przemyślenie po nocy... skoro to jest słownik to inaczej należało by podejść do struktury bazy.
Mamy sobie taką oto tabelki:
słowo_polskie

  • id - long PK
  • słowo - varchar
  • znaczenia - text
  • odpowiednik_ang - long FK

słowo_ang

  • id - long PK
  • słowo - varchar
  • znaczenia - text
  • odpowiednik_pol - long FK

i teraz załóżmy, że szukamy słowa w języku polskim i chcemy je przetłumaczyć na angielski. Wystarczy zatem coś w rodzaju:

Select słowo_polskie.słowo, słowo_polskie.znaczenia, słowo_ang.słowo from słowo_polskie, słowo_ang where słowo_polskie.słowo like 'słowo_szukane' and słowo_polskie.id = słowo_ang.id;

nie jestem pewien co do składni i wydajności, ale całą noc w robocie spędziłem. Generalnie mam nadzieję, że idea jest zrozumiała.

1 użytkowników online, w tym zalogowanych: 0, gości: 1