Pytanie podobnie jak "%" nie przyjmuje wartości NULL


Mam zapytanie zbudowane z danych wejściowych użytkownika (przekazywane za pomocą formularza HTML). Wygląda (prosty przykład):

Select * From [table] Where [table].[column] like '<parameter>'

Ten parametr może być opcjonalny, więc jeśli użytkownik opuścił odpowiednie pole wejściowe puste, przejdę %. Działało dobrze, dopóki nie napotkałem wartości NULL. Rozumiem, że symbole dopasowania "%" nie mają wartości null, ale w tym przypadku chciałbym uznać NULL za pusty ciąg znaków.

Co powinienem zrobić? Zmienić zapytanie (jak?) Lub przekazać inny symbol (y), gdy użytkownik opuścił puste wejście?

Dzięki.

PS. To prawdziwy problem z istniejącego systemu i wiem, że to dalekie od optymalnego rozwiązania, ale muszę sobie z nim poradzić.


23
2017-10-13 13:51


pochodzenie


Mam nadzieję, że używasz sparametryzowanych zapytań, ponieważ twój kod może być bardzo otwarty na SQL Injection. Widzieć tabele boby - Oded
Skąd pochodzi parametr? (@Oded: Chyba tak '<parameter>' miał oznaczać ...) - Tomalak
@Tomalak - Mam nadzieję, że masz rację ... - Oded


Odpowiedzi:


Możesz użyć coalesce traktować null jak pusty ciąg:

where COALESCE([table].[column],'') like '<parameter>'

Na serwerze SQL można również użyć IsNull:

where IsNull([table].[column],'') like '<parameter>'

51
2017-10-13 13:53



A co z przypadkiem, gdy indeks jest zdefiniowany w [tabela]. [Kolumna]? - Mihai Bejenariu


Myślę, że to może działać:

Select * From [table] Where [table].[column] is null or [table].[column] like '<parameter>'

3
2017-10-13 13:53





Cóż, co powiesz

SELECT 
  * 
FROM 
  [table] 
WHERE
  ([table].[column] like <parameter>) OR 
  (<parameter> = '%')

... tak, że gdy miniesz "%", otrzymasz wszystkie wiersze z powrotem, w przeciwnym razie działa tak, jak masz to w tej chwili.


3
2017-10-13 13:54





isnull ([tabela]. [kolumna], "") jak "%"

Działa jak marzenie


3
2017-07-27 10:03





Zrób dwa stwierdzenia! Jeśli użytkownik nie przeszedł żadnego użytkownika parametru:

Select * From [table] Where [table].[column] like '%' or [table].[column] is null;

1
2017-10-13 13:56



Zaskakująco, NULL ! = NULL , musisz użyć specjalnego operatora IS NULL - Piskvor
UPS! Przepraszam! Poprawiłem to. - Tim
Czy to nie to samo co select * from [table]? - Caramiriel
Tak, ale zwykle będziesz miał więcej pól, a% może być parametrem dostarczanym przez PHP, na przykład - Berry M.


Co powiesz na..

Select * From [table] Where ISNULL([table].[column], '') like '<parameter>'

Więc to zajmie twoją rzeczywistą wartość kolumny, lub jeśli to null pusty ciąg i porównaj go z twoim parametrem, zakładając, że używasz serwera ms sql.


0
2017-10-13 13:57





Oparte na Indeks w klauzuli Where Problem z tym podejściem

where COALESCE([table].[column],'') like '<parameter>'

Jest :

Jeśli użyłeś indeksu na [kolumnie], z powodu funkcji COALESCE, SQL Server nie może użyć twojego indeksu, to znaczy, że zmarnowałeś swój indeks

I

Problem z tym podejściem

Where [table].[column] like '%' or [table].[column] is null

Jest :

Jeśli [tabela]. [Kolumna] ma wartość null, kod będzie wyglądał następująco:

Where null like '%' or [table].[column] is null

i niezależnie od drugiej części klauzuli Where ([table]. [column] ma wartość null) wynikiem oceny będzie UNKNOWN i filtr SQL Server, który zostanie zarejestrowany.

NULL OR True = UNKNOWN

NULL OR Fałsz = NIEZNANY

Jest to więc zoptymalizowane i zerowe podejście:

Select * From [table] 
 WHERE 
      CASE 
          WHEN [table].[column] IS NULL THEN 1 
          WHEN [table].[column] like '<parameter>' THEN 1 
          ELSE 0 
      END   =  1

0
2017-10-06 12:18



Ta odpowiedź jest po prostu bryłą kodu, wydaje się bardzo podobna do innej. Proszę wyjaśnić, dlaczego jest to dobra odpowiedź, jak działa kod i jak różni się on od innych odpowiedzi. - AdrianHHH


Dzień dobry, skorzystaj z tego rozwiązania, myślę, że jest to mieszanka rozwiązań:

@parameter nvarchar (30)

if @parameter = ''
      Begin
          Set @parameter = '%'
      End

select * from [table] as t where ISNULL (t. [column], '') like '%' + @parameter + '%'

Jeśli chcesz zacząć od tego parametru, usuwa pierwszy znak "%" i znak plus

Mam nadzieję, że okaże się to przydatne


0
2017-12-16 18:14





Chciałem czegoś podobnego, aby faktycznie znaleźć "%" (wszystkie), w tym zero lub określoną wartość po wprowadzeniu.

Dla Oracle isnull nie działa i w moim przypadku COALESCE ani.

Użyłem tej opcji w klauzuli where:

where decode(table1.field1,null,' ',table1.field1) like '%'

Mam nadzieję, że działa dla innych.


0
2017-07-15 19:38



coalesce działa na Oracle. Twój kod jest równoważny where coalesce(table1.field, ' ') like '%' - trincot