2012-07-13 17 views
8

Próbuję wybrać wiele kolumn, ale nie wszystkie kolumny, z bazy danych. Wszystkie kolumny, które chcę wybrać, zaczną się od "słowa".Symbole wieloznaczne w kolumnie dla MySQL

Więc w Pseudokod Chciałbym to zrobić:

SELECT "word%" from searchterms where onstate = 1; 

Bardziej lub mniej. Nie znajduję żadnej dokumentacji, jak to zrobić - czy jest to możliwe w MySQL? Zasadniczo próbuję przechowywać listę słów w jednym wierszu, z identyfikatorem, i chcę skojarzyć wszystkie słowa z tym identyfikatorem, gdy będę pobierać rekordy. Wszystkie słowa zostaną połączone jako ciąg i przekazane do innej funkcji w tablicy/słowniku z ich identyfikatorem.

Próbuję wykonać możliwie jak najwięcej połączeń z bazami danych, aby zachować szybki kod.

Ok, oto kolejne pytanie do was:

Nie zamierzamy być zmienna liczba kolumn o nazwie „słowa” w nich. Czy szybsze byłoby wykonanie osobnego wywołania bazy danych dla każdego wiersza, z wygenerowaną kwerendą Pythona dla każdego wiersza, czy szybsze byłoby WYBIERANIE * i używanie wyłącznie kolumn, których potrzebowałem? Czy można powiedzieć SELECT * NOT XYZ?

+0

Czy nie byłoby łatwiej używać wierszy niż kolumn? –

+0

Cóż, problem z tym, i może to być mój projekt bazy danych (to był taki ból głowy w tym projekcie), to wtedy potrzebowałbym wiersza dla KAŻDEGO słowa i powiązanej wartości, a ja nie chcą tego, ponieważ te słowa są ze sobą powiązane. Będą częścią tego samego zapytania do API. Inne, z innym identyfikatorem będą innym zapytaniem. –

+2

Jeśli masz nowe pytanie, użyj nowego wpisu. Answerers nie są powiadamiani o edytowaniu tego posta, nie mówiąc już o tym, że zredagowałeś go, by zadać inne pytanie. –

Odpowiedz

8

Nie, SQL nie dostarcza żadnej składni do takiego wyboru.

To, co może zrobić, to najpierw zapytać MySQL o a list of column names, a następnie wygenerować zapytanie SQL z tych informacji.

SELECT column_name 
FROM information_schema.columns 
WHERE table_name = 'your_table' 
    AND column_name LIKE 'word%' 

Wybierajmy nazwy kolumn. Następnie można zrobić w Pythonie:

"SELECT * FROM your_table WHERE " + ' '.join(['%s = 1' % name for name in columns]) 

Zamiast ciąg konkatenacji, polecam korzystania SQLAlchemy zamiast zrobić generowanie SQL dla Ciebie.

Jeśli jednak wszystko, co robisz, ogranicza liczbę kolumn, nie ma potrzeby wykonywania takiego dynamicznego zapytania w ogóle. Ciężka praca dla bazy danych polega na wybraniu rzędów; nie ma sensu wysyłać 5 kolumn na 10 lub wszystkich 10.

W takim przypadku wystarczy użyć "SELECT * FROM ..." i użyć Pythona do wybrania kolumn z zestawu wyników.

+0

Czy to nie w praktyce dałoby mi dokładną listę, której musiałem użyć? –

+0

Tak, ale będziesz musiał użyć Pythona, aby skonstruować ostateczny SQL; nie ma czystej metody SQL implementacji zapytania psuedocode. –

1

Nie, nie można dynamicznie tworzyć listy kolumn do wybrania. Musi on zostać zakodowany w ostatecznym zapytaniu.

Twoje obecne zapytanie wygeneruje zestaw wyników z jedną kolumną, a wartość tej kolumny będzie ciągiem "word%" we wszystkich wierszach spełniających warunek.

+0

Zobacz wyżej dla nazw kolumn: http://stackoverflow.com/a/11466826/1091386 – icedwater

1

Można wygenerować listę nazw kolumn najpierw za pomocą

SHOW COLUMNS IN tblname LIKE "word%" 

następnie pętli kursora i generowania instrukcji SQL wykorzystuje wszystkie kolumny z kwerendy powyżej.

"SELECT {0} FROM searchterms WHERE onstate = 1".format(', '.join(columns)) 
0

To może być pomocne: MySQL wildcard in select

Podsumowując nie jest możliwe w MySQL bezpośrednio.

Co można zrobić jako brudne obejście to pobrać wszystkie nazwy kolumn z tabeli z zapytaniem początkowym (http://dev.mysql.com/doc/refman/5.0/en/show-columns.html), a następnie porównać w pythonie, czy nazwa pasuje do wzorca. Następnie można wykonać instrukcję wyboru MySQL z odnalezionymi nazwami kolumn:

SELECT word1, word2, word3 from searchterms where onstate = 1; 
Powiązane problemy