SQL dotaz.Vyber jednoho slova ze slopce

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
parti
Člen | 117
+
0
-

Ahoj prosim neporadili by jste mi jak napsat dotaz do DB pri kterem si vyberu ne vsechno, co se nachazi ve sloupecku ale jenom jedno slovo z toho sloupecku.
Dotaz mam napsany takto

public function findHostnameRegion($name) {
        return $this->database->table('os')
                ->where('name',$name);
    }

a pak v sablone to mam takto
Z toho vypisu dostanu cely zaznam ktery se nachazi v tom sloupecku.

<td>{foreach $rows as $item}  <p>{$item->cmdb_category}</p>{/foreach}</td>

pro lepsi predstavu tohle jsou moje slopce s daty[jedne radek jeden sloupecek] a z nich bych portreboval vytahnout z prvniho skoupce Linux,z dalsi Windows a z dalsi ESX.

Virtual Server VMWare **Linux** / Server / Hardware
Virtual Server VMWare **Linux** / Server / Hardware
VMWare **Windows** / Server / Hardware
VMware **ESX** server/ Server / Hardware

Nevim jeslti ma nette nejakou funkci kterou by se dalo v tom dotazu rict co mi ma vrati[Linux,Winidovs,ESX]. Pak druha moznost je to napsat cez queryArgs a tam v nem select.

Dekuji za radu.

Editoval parti (23. 2. 2017 18:34)

jik
Člen | 146
+
0
-

V postgresu lze použít zápis:

SELECT id,name FROM page;
 id |          name
----+------------------------
  2 | Pospolné zřízení
  3 | Kapitalistické zřízení
  1 | Úvod
SELECT id,name FROM page WHERE name~'vod';
 id | name
----+------
  1 | Úvod

Takto lze vybrat řádky, které vyhovují regulárnímu výrazu. Potom výběr položek lze provést takto:

 SELECT id, name, substring (name from 'zřízení') AS vyber FROM page WHERE name~'zřízení';
 id |          name          |  vyber
----+------------------------+---------
  2 | Pospolné zřízení       | zřízení
  3 | Kapitalistické zřízení | zřízení

Do NotORM bych to (na ostro a bez záruky) zkusil přeložit takto:

$this->database->table('page')
	->select("id, name, substring (name from 'zřízení') AS vyber")
	->where("name~'zřízení'");

Pro MariaDB/MySQL existuje také něco takového, viz https://mariadb.com/…ariadb/like/

Editoval jik (23. 2. 2017 21:22)

CZechBoY
Člen | 3608
+
0
-

@jik Nikde nevidim to vyříznutí části řetězce, nebo jsem slepej? To cos poslal je obyčejnej LIKE %% v mysql, nebo se pletu?

jik
Člen | 146
+
0
-

CZechBoY: substring (name from ‚zřízení‘)

Kromě toho podle mě těmito dotazy pouze vytáhnu položky, ale bude muset následovat nějaká další logika, která bude z vybraných položek hledat příslušné hodnoty (jednou to, podruhé jinou).

Editoval jik (23. 2. 2017 21:29)

CZechBoY
Člen | 3608
+
0
-

Aha, no s postgres jsem nikdy nedělal tak nevim :-)

Jinak stejně se mi zdá, že nebudeš chtít rozdělovat podle mezery ale budeš chtít i sousloví „Windows Server“ atd. Je to tak?

parti
Člen | 117
+
0
-

Ahoj databazi mam v MySql.
Co se tyka toho stringu je potreba vytahnout jenom to jedno slovo. Takze Linux Windows atd…

Editoval parti (23. 2. 2017 22:55)

CZechBoY
Člen | 3608
+
0
-

A chceš jen určitý slova (udělej si whitelist) nebo prostě všechny oddělený mezerou?

parti
Člen | 117
+
0
-

Uzivatel ma jeden input kde zada nejakou hodnotu napriklad jmeno servru napriklad server1. Podle ty hodnoty se mu vypise vse co se nachazi v tomhle radku os[os-je sloupecek] v DB

Virtual Server VMWare **Linux** / Server / Hardware

Potrebuji misto celeho vypisu vypsat jenom to slovo Linux.
Samozrejme pokudu uzivatel zada v inputu napriklad server2 tak se mu v radku os[os-slopec] v DB zobrazi vypis
a nasledne i v sablone kde se mu ten vypis posle.

VMWare **Windows** / Server / Hardware

a z toho vystupu potrebuji zase vypsat ne vsechno ale jenom to slovo Windows.

Dotaz do db jsem mel postaveny takhel

public function findHostnameRegion($name) {
        return $this->database->table('os')
                ->where('name',$name);
    }

to mi vrati vse co se nachazi v tom radku celi string ja bych potreboval vratiti jenom to jedno slovo ze stringu.
Dekuji

Mysteria
Člen | 797
+
0
-

Tak můžeš si normálně přidat nějaký vlastní sloupec pomocí ->select('... AS filteredOS'), ale jestli dokážeš tohle nějak udělat přímo v MySQL pomocí jeho funkcí, tak to nevím.

parti
Člen | 117
+
0
-

A co tak to napsat jak queryArgs a v nem nejaky Select Case? Slo by to je to jenom myslenka.

parti
Člen | 117
+
0
-

Reseni jak jsem to napsal a funguje to

public function findHostnameOs($name) {
        return $this->database->query("SELECT  category,
        CASE
            WHEN category LIKE '%Linux%' THEN 'Linux'
            WHEN category LIKE '%Windows%' THEN 'Windows'
            WHEN category LIKE '%X%' THEN 'x'
            WHEN category LIKE '%H%' THEN 'H'
            WHEN category LIKE '%E%' THEN 'E'
            ELSE ''
        END AS OS
      FROM   server
      WHERE name=?", $name);
    }

Editoval parti (24. 2. 2017 12:39)

CZechBoY
Člen | 3608
+
0
-

Ano, jak jsem psal… jestli to kontroluješ proti nějakýmu whitelistu tak ho použij.
Lepší by bylo si tenhle seznam někde uložit a nemít to zahardcodovaný na nějakým nedohledatelným místě.

parti
Člen | 117
+
0
-

Aha tak se omlouvam nevedel jsem co jsi myslel tim slovem „whitelistu“. :o)