DZWON

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu

Dzień dobry.
Kontynuując o prymitywnych typach danych, rozważaliśmy ostatnio, a dziś porozmawiamy o tym wpisz NULL.

Typ NULL to literał, który może zawierać tylko jedną wartość - wartość „NULL”.
NULL - nie równa się pustemu odwołaniu, spacji lub niezdefiniowanemu typowi.

Jest używany podczas pracy z bazą danych (podczas łączenia tabel), służy do określenia brakującej wartości podczas pracy z bazą danych.
Wartość NULL można uzyskać, przypisując tę \u200b\u200bwartość do zmiennej:
Zmienna \u003d NULL.

Wartości NULL są tworzone w wyniku łączenia, gdy element z jednej tabeli nie został warunkowo znaleziony jako odpowiadający element z innej. Wartości NULL mają określone cechy:
- porównanie wartości NULL z dowolnym innym argumentem zawsze zwraca fałsz;

Aby zdefiniować wartość NULL, użyj konstrukcji JEST NULL.
Aby przekonwertować typ NULL, użyj funkcji ISNULL (isNULL).

W celu obcięcia pól zawierających wartości NULL w wyniku zapytania stosuje się następujące konstrukcje: - nie jest NULL - nie jest NULL

Przykłady

Przykład sprawdzania wartości NULL

WYBIERZ katalog. Nomenklatura. Imię i nazwisko, numer referencyjny. Nomenklatura. Cena zakupu GDZIE Katalog. Nomenklatura. Cena zakupu wynosi zero

Przykład funkcji ISNULL ()
Wartość zwracana przez funkcję IS NULL (): wartość pierwszego parametru, jeśli pierwszy parametr nie zawiera wartości NULL, w przeciwnym razie wartość drugiego parametru. Drugi parametr zostanie przekonwertowany na typ pierwszego parametru, jeśli typ pierwszego parametru jest ciągiem lub liczbą.

// Pobierz kwotę dla pola ilości. W przypadku braku rekordów, uzyskaj 0WYBIERZ JEST NULL (SUMA (ilość), 0) jako ilość z dokumentu. Wył. Kompozycja

Z poważaniem, programisto 1C.
Zostaw swoje komentarze, jestem zainteresowany Twoją opinią.

NULL to nic innego jak brak wartości. Wiele osób myli to z wartością „0” typu numer, pustym odniesieniem do jakiegoś obiektu lub z pustym łańcuchem. Z tego błędnego przekonania wynika wiele błędów.

Wartość NULL pojawi się, jeśli żądanie zawiera wywołanie nieistniejącego pola, właściwości lub uszkodzonego łącza.

Opiera się na języku SQL, który nie pozwala normalnej równości na sprawdzanie wartości NULL. Poniżej znajdują się dwa sposoby sprawdzenia NULL w 1C 8.3.

Funkcja języka zapytań 1C 8.3 IS NULL () ma dwa parametry wejściowe:

  • testowane wyrażenie;
  • wyrażenie zastępcze.

Jeśli testowaną wartością jest NULL, funkcja ta zwróci wartość wyrażenia zastępującego. Jeśli wartość jest różna od NULL, zwracane jest samo wyrażenie.

Poniżej przykład. Wybiera wszystkie pozycje nomenklatury z tabelarycznej sekcji towarów z dokumentu „Odbiór towarów i usług”. Za pomocą lewego połączenia każda pozycja jest stemplowana najnowszą ceną z rejestru informacji o cenach towarów.

W takim przypadku może zaistnieć sytuacja, że \u200b\u200bdla dowolnej pozycji w rejestrze może po prostu nie być ceny. W takim przypadku funkcja ISNULL zwróci zwykłe zero. Jeśli go nie wykorzystamy, to przy próbie wykonania operacji arytmetycznych na polu „Cena” o wartości NULL otrzymamy błąd.

WYBIERAĆ

THERE ISNULL (Prices.Price, 0) AS Actual Price
Z



GDZIE

W instrukcji SELECT JEST NULL

Analogiem ISNULL () jest IS NULL, które jest używane w instrukcji SELECT i sprawdza, czy wartość jest równa NULL. „IS” w tym przypadku oznacza równość, a zapytanie z poprzedniego przykładu wyglądałoby tak:

WYBIERAĆ
Products.Nomenclature AS Product,
WYBÓR
KIEDY Ceny są zerowe
WTEDY 0
INNE Ceny. Cena
END AS Actual Price
Z
Dokument Towary przychodzące Usługi Towary jako towary
LEFT JOIN Dedykowane.CenyNomenklatury.SliceLast AS Ceny
Software Products.Nomenclature \u003d Ceny.Nomenklatura
GDZIE
Products.Link \u003d & Link do dokumentu

Różnice między funkcją IS NULL () a IS NULL

Jak widać z poprzednich przykładów, w obu przypadkach zapytanie zwraca te same dane. ISNULL () jest skrótem od SELECT WHEN… IS NULL… END, ale nadal jest preferowana z następujących powodów:

  1. Funkcja ISNULL () optymalizuje zapytanie. Jest odczytywana raz, więc podczas sprawdzania złożonego wyrażenia zapytanie zostanie przetworzone szybciej.
  2. Funkcja ISNULL () skraca konstrukcję, dzięki czemu zapytanie jest bardziej czytelne.
  3. Gdy funkcja ISNULL () jest wykonywana, wyrażenie zastępujące jest rzutowane na typ testowanego wyrażenia dla typów typów łańcuchowych (do długości łańcucha) i liczbowych (do szerokości bitowej).

ZERO - brakujące wartości.
Nie mylić z zerem! NULL to nie liczba, nie spacja, puste odniesienie, Undefined.

NULL to wartość tworząca typ, tj. istnieje typ NULL i pojedyncza wartość tego typu.

Wartości NULL pojawiają się w zapytaniu w następujących sytuacjach:
a) Łączenie zewnętrzne, w którym nie znaleziono odpowiadającego rekordu w innej tabeli (z lewym - w drugiej, z prawym - w pierwszym, z pełnym - w obu)
b) Odwołanie się do atrybutów elementów grupy i odwrotnie.
c) NULL na liście pól wyboru (SELECT)
d) Odwołanie się do szczegółów zepsutego linku

JEST NULLużywany w operatorze SELECT (jak przy sprawdzaniu, czy wartość jest pusta (Wartość JEST NULL)):
Kod 1C v 8.x
WYBÓR
GDY Wartość JEST NULL, TO Wynik Jeśli NULL
Wartość ELSE
KONIEC

inny przykład:
Kod 1C v 8.x WYBIERZ

WYBÓR, GDY Salda nomenklatury księgowej Saldo kwoty jest zerowe, a następnie 0
Salda księgowe ELSE Nomenklatura Saldo ilościowe Saldo ilościowe
Z



GDZIE

Funkcjonować ISNULL (wartość; ResultIf NULL) zwraca wartość pierwszego parametru, jeśli nie jest równa NULL, a wartość drugiego parametru w przeciwnym razie
Jest zwiniętą SELECT ... END, ale preferowana jest wartość IS NULL.
Kod 1C v 8.x
WYBIERAĆ
ISNULL (Directory.Nomenclature.Article, "---") AS Article,
Odniesienie Nomenklatura Prezentacja AS Nomenklatura

inny przykład:
Kod 1C v 8.x
WYBIERAĆ
Katalog nomenklatury.
IS NULL (NomenclatureAccountingBalance.QuantityBalance, 0) AS QuantityBalance
Z
Directory.Nomenclature AS Directory
LEFT DOŁĄCZ Rejestr akumulacji Nomenklatura księgowa Salda AS Księgowość Nomenklatura
Software Nomenclature AccountingBalances.Nomenclature \u003d Nomenclature Directory.Link
GDZIE
DirectoryNomenclature.ThisGroup \u003d FALSE
W tym przykładzie pobierane są wszystkie elementy katalogu pozycji, po czym dla każdej pozycji pobierane są salda bieżące z rejestru akumulacyjnego. Ponieważ dla pozycji, dla której nie ma sald, wirtualna tabela sald nie zwróci rekordu, wówczas w wyniku połączenia w polu „NomenclatureAccountRemains.Quantity” pojawią się wartości NULL dla pozycji, dla której nie było sald. Aby uzyskać wartość 0 zamiast wartości NULL w wyniku zapytania, użyliśmy funkcji IS NULL (), która dokona żądanej zamiany.

JEST NULL różni się od WYBORU z następujących powodów:
a) Jeśli JEST NULL, zapytanie lepiej czytać (łatwiej)
b) Jeśli IS NULL, jeśli złożone wyrażenie jest zaznaczone, to działa szybciej, ponieważ jest oceniane raz
c) Jeśli IS NULL, wyrażenie zastępujące jest rzutowane na typ testowanego wyrażenia, jeśli jest typu String (długość) lub Number (szerokość w bitach).

Nie można sprawdzić wartości NULL zwykłą równością, ponieważ logika trójwartościowa działa w SQL - True, False, NULL, a wynikiem takiego porównania będzie NIEZNANY, co w 1C 8.0 jest podobne do FAŁSZ.
ZERO<> 0, więc dla lewych połączeń zewnętrznych ref. Nomenklatura z tabelami sald, cen, Kontrahenci z wzajemnymi rozliczeniami, w przypadku braku takich zapisów będzie NULL, które nie jest równe 0. Najlepszym rozwiązaniem jest NULL

Podczas pracy z językiem zapytań czasami pojawia się sytuacja, gdy trzeba zamienić wartość NULL na inną. Potrzeba takiej operacji może powstać np. Przy odbiorze stanów magazynowych całego towaru. W tym artykule opisano, jak używać funkcji języka zapytań ISNULL () do rozwiązywania podobnych problemów, a także omówiono inne rozwiązania.

Funkcja ISNULL

Język zapytań implementuje funkcję ISNULL (), której celem jest zastąpienie wyrażenia innym wyrażeniem, jeśli wyrażenie miało wartość NULL. Diagram składni tej funkcji wygląda następująco:

ISNULL (<Проверяемое выражение>, <Выражение замены>)

Ta funkcja zwróci wartość pierwszego parametru, jeśli nie jest równa NULL, oraz wartość drugiego wyrażenia, w przeciwnym razie.


WYBIERAĆ
IS NULL (NomenclatureAccountingBalance.QuantityBalance, 0) AS QuantityBalance
Z

GDZIE

W tym przykładzie pobierane są wszystkie elementy katalogu pozycji, po czym dla każdej pozycji pobierane są salda bieżące z rejestru akumulacyjnego. Ponieważ dla pozycji, dla której nie ma sald wirtualna tabela sald nie zwróci rekordu, wówczas w wyniku połączenia w polu „NomenclatureAccountRemains.Quantity” pojawią się wartości NULL dla pozycji, dla której nie było sald. Aby uzyskać wartość 0 zamiast wartości NULL w wyniku zapytania, użyliśmy funkcji IS NULL (), która dokona żądanej zamiany.

Korzystanie z operacji SELECT

Aby rozwiązać problem opisany wcześniej, możesz użyć operacji języka zapytania SELECT. Przykład, jak wyglądałoby zapytanie podobne do poprzedniego:


WYBIERAĆ
Katalog nomenklatury.
WYBÓR, GDY Salda nomenklatury księgowej Saldo kwoty jest zerowe, a następnie 0
Salda księgowe ELSE Nomenklatura Saldo ilościowe Saldo ilościowe
Z
Directory.Nomenclature AS Directory
LEFT DOŁĄCZ Rejestr akumulacji Nomenklatura księgowa Salda AS Księgowość Nomenklatura
Software Nomenclature AccountingBalances.Nomenclature \u003d Nomenclature Directory.Link
GDZIE
DirectoryNomenclature.ThisGroup \u003d FALSE

Wynik tego zapytania będzie identyczny z wynikiem zapytania podanego w poprzedniej sekcji.

Funkcja ISNULL () jest lepsza od operacji SELECT z następujących powodów: pisanie za pomocą ISNULL () jest nieco bardziej zwarte, co zwiększa czytelność zapytania. Ponadto w przypadku, gdy testowane wyrażenie jest funkcją złożoną, w tym funkcją agregującą, ocena funkcji ISNULL () może być szybsza niż w przypadku analogu zapisanego za pomocą funkcji WYBÓR.

Cechy funkcji ISNULL

Funkcja ISNULL (), mimo że jest analogiczna do operacji SELECT ze sprawdzaniem wartości NULL, ma jednak różnicę. Różnica polega na tym, że jeśli wyrażenie funkcyjne ma typ ciągowy lub numeryczny, to wyrażenie zastępujące zostanie przekonwertowane na typ testowanego wyrażenia.

Na przykład w przypadku, gdy testowane wyrażenie ma typ String (5), a wyrażenie zastępujące ma typ String (10), typ wynikowy zostanie przekonwertowany na typ String (5). W rezultacie, gdy funkcja zwraca wyrażenie zastępujące, wartość zostanie obcięta do pięciu znaków.

Podobnie jest z wyrażeniami numerycznymi: wartość zastępowanego wyrażenia zostanie przekonwertowana na typ testowanego, tj. wyrażenie, które ma zostać zastąpione, może zostać obcięte. Jeśli wartości nie można przekonwertować, język zapytań zakończy zapytanie z błędem. Na przykład próba konwersji liczby 1000 na typ Number (2) zakończy się błędem.

DZWON

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu