Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL]Problem z zapytaniem SQL
Forum PHP.pl > Forum > Przedszkole
Bolo1991
Witam,
Jako że jestem na początku drogi z SQL, mam pytanie w sprawie jednego zapytania:
Kod
select doc.doc_user_number As [Numer Umowy],product_doc.order_number As [Pozycja],product_doc.quantity As [Ilość sztuk],replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(product_doc.tag_production,'DRZ',''),'LAK',''),'POS',''),'NPR',''),'*',''),'HS',''),'HKS',''),'LUK',''),'SKOS',''),' ','') As [Tag]
,Production_line.production_line_type As [Linia],doc.doc_status_id As [Status Umowy],doc.doc_delivery_date As [Data wyjazdu], replace(replace(replace(replace(replace(replace(replace(replace(doc.tag_feature,'*1:',''),'*2:',' '),'MD',''),'AD',''),'ELEG',''),'88',''),'HS',''),'*','') As [Kolor]                        
from [PAM_TEST].dbo.doc
join dbo.doc_status on doc_status.id = doc.doc_status_id
join dbo.Production_line on Production_line.branch_id = doc.branch_id
join dbo.product_doc on product_doc.doc_id = doc.id
  where product_doc.tag_production not like '' And doc.tag_feature not like '' And doc.tag_feature not like '%2K:%' And doc.tag_feature not like '%1S:%' And doc.doc_status_id = 7 And Production_line.production_line_type  = -2
  group by Production_line.production_line_type, doc.doc_user_number, doc.doc_status_id, doc.doc_delivery_date, doc.tag_feature,product_doc.tag_production, product_doc.order_number,product_doc.quantity
  order by doc.doc_delivery_date asc


Wszystko niby fajnie pokazuje, lecz pokazuje mi wartości puste z jednej kolumny mimo że rozgraniczyłem, żeby nie pokazywać. Proszę o doradzenie co robię źle.
trueblue
A możesz wskazać gdzie zawarłeś ten warunek?
Bolo1991
Kod
where product_doc.tag_production not like ''
nospor
A jestes pewien ze tam sa puste teksty? Moze tam sa NULLe ?
trueblue
To teraz zastanów się co zwraca:

  1. REPLACE(product_doc.tag_production,'DRZ','')


i czy Twój warunek zostanie spełniony dla tej kolumny.
Bolo1991
Nulli nie ma bo sprawdzałem,
No ten warunek ma zamieniać wartość "DRZ' na puste, bo nie które znaki muszę zamieniać na puste, żeby ich nie pokazywać, a potem chce nie pokazywać pustych smile.gif
trueblue
Ten warunek nic nie zamienia, bo to nie warunek.

Nie sądzisz, że operujesz na "surowej" wartości w warunku, a wyświetlasz przetworzoną? Jednym słowem Twój warunek ma się nijak, do kolumny Tag.
Bolo1991
No ok, czyli rozumiem że to rozwiązanie jest złe, a jakie jest poprawne ? Po proszę o naprowadzenie.
trueblue
Warunek należy założyć na przetworzonej kolumnie.
Bolo1991
Rozumiem i nie rozumiem smile.gif , czyli w tym selecie ma tego nie być a ma być where ?
trueblue
Niezoptymalizowne rozwiązanie, to takie, że przenosisz całą wyliczaną kolumnę do WHERE (i porównujesz z ''), bo chcesz się pozbyć pustych wartości po przetworzeniu, a nie na "surowej" kolumnie.

A gdy to zrobisz, to zauważysz, że nie ma sensu wyliczanie tej kolumny (cała ta gąsienica z REPLACE), bo i tak chcesz się pozbyć wierszy z '', co się sprowadza do warunku:
  1. product_doc.tag_production<>'DRZ' AND product_doc.tag_production<>'LAK' ... itd.
Bolo1991
No tak jest to zrozumiałe i działające w przypadku gdy w kolumnie jest tylko jedna wartość i sobie mogę ją wykluczyć, ale co w przypadku gdy mam 3 wartości i chce wykluczyć 2 a jedną zostawić ?



Np chce zostawić tylko wartość BRO, a reszta ma się nie pojawiać obok.
trueblue
To wtedy pozostaje tylko ta pierwsza opcja.
Bolo1991
Yh czyli pierwszy który?
trueblue
W poście #11 są dwa. Pierwszy to ten pierwszy.
Bolo1991
No dupa smile.gif Nie działa, zapis teraz wygląda tak, o ile teraz nie pokazuje mi pustych to za chiny ludowe nie mogę usunąć np 'DRZ'.
Kod
    select doc.doc_user_number As [Numer Umowy],product_doc.order_number As [Pozycja],product_doc.quantity As [Ilość sztuk],replace(product_doc.tag_production,'*',' ') As [Tag]
,Production_line.production_line_type As [Linia],doc.doc_status_id As [Status Umowy],doc.doc_delivery_date As [Data wyjazdu], replace(replace(replace(replace(replace(replace(replace(replace(doc.tag_feature,'*1:',''),'*2:',' '),'MD',''),'AD',''),'ELEG',''),'88',''),'HS',''),'*','') As [Kolor]                        
from [PAM_TEST].dbo.doc
join dbo.doc_status on doc_status.id = doc.doc_status_id
join dbo.Production_line on Production_line.branch_id = doc.branch_id
join dbo.product_doc on product_doc.doc_id = doc.id
  where product_doc.tag_production not like '' And product_doc.tag_production <> 'DRZ' And doc.tag_feature not like '' And doc.tag_feature not like '%2K:%' And doc.tag_feature not like '%1S:%' And doc.doc_status_id = 7 And Production_line.production_line_type  = -2
  group by Production_line.production_line_type, doc.doc_user_number, doc.doc_status_id, doc.doc_delivery_date, doc.tag_feature,product_doc.tag_production, product_doc.order_number,product_doc.quantity
  order by doc.doc_delivery_date asc
trueblue
  1. WHERE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(product_doc.tag_production,'DRZ',''),'LAK',''),'POS',''),'NPR',''),'*',''),'HS',''),'HKS',''),'LUK',''),'SKOS',''),' ','') <> ''
Bolo1991
Dzięki, ale efekt nie jest taki jak być powinien :
Kod
    select doc.doc_user_number As [Numer Umowy],product_doc.order_number As [Pozycja],product_doc.quantity As [Ilość sztuk],replace(product_doc.tag_production,'*',' ') As [Tag]
,Production_line.production_line_type As [Linia],doc.doc_status_id As [Status Umowy],doc.doc_delivery_date As [Data wyjazdu], replace(replace(replace(replace(replace(replace(replace(replace(doc.tag_feature,'*1:',''),'*2:',' '),'MD',''),'AD',''),'ELEG',''),'88',''),'HS',''),'*','') As [Kolor]                        
from [PAM_TEST].dbo.doc
join dbo.doc_status on doc_status.id = doc.doc_status_id
join dbo.Production_line on Production_line.branch_id = doc.branch_id
join dbo.product_doc on product_doc.doc_id = doc.id
  where REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(product_doc.tag_production,'DRZ',''),'LAK',''),'POS',''),'NPR',''),'*',''),'HS',''),'HKS',''),'LUK',''),'SKOS',''),' ','') <> '' And doc.tag_feature not like '' And doc.tag_feature not like '%2K:%' And doc.tag_feature not like '%1S:%' And doc.doc_status_id = 7 And Production_line.production_line_type  = -2
  group by Production_line.production_line_type, doc.doc_user_number, doc.doc_status_id, doc.doc_delivery_date, doc.tag_feature,product_doc.tag_production, product_doc.order_number,product_doc.quantity
  order by doc.doc_delivery_date asc


Rezultat:

trueblue
W SELECT zostawiasz tak jak było na początku. Zmieniasz tylko warunek w klauzuli WHERE na ten, który podałem. Teraz w WHERE jest ok, ale popsułeś w SELECT.
W SELECT i WHERE ma być ta gąsienica.

Inne rozwiązanie, to owinąć pierwotne zapytanie, a warunek (na tej przeliczonej kolumnie Tag) przenieść do zewnętrznego SELECT.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.