Powrót do strony głównej

Notacja dla warunków SQL w stringach JSON

Zaproponowano stringową notację do opisu warunków SQL w konfiguracjach JSON. Obsługuje porównania, zbiory, przedziały z MIN/MAX/BETWEEN. Walidacja przez regex, przykłady transformacji i analiza analogów.

Stringowa notacja SQL z JSON dla backendu
Advertisement 728x90

Kompaktowa notacja stringowa do generowania warunków SQL z JSON

Przy budowaniu zapytań SQL na podstawie plików JSON powstają długie wyrażenia warunkowe. Początkowe podejście wykorzystywało tablice typu "vendor_id": [17,-23], przekształcane w vendor_id = 17 OR NOT vendor_id = 23. To kompaktowe, ale niekompletne: brak wsparcia dla zakresów, agregacji MIN/MAX i niejednoznaczna składnia.

Nowa notacja rozwiązuje problem w formie ciągu znaków, walidowanego wyrażeniami regularnymi. Obejmuje porównania, zbiory, zakresy i negacje dla dowolnych typów z operacjami =, <, >, !. Znak minusu oznacza logiczne zaprzeczenie, niezależnie od typu danych.

Główne konstrukcje notacji

Notacja przekształca ciągi typu X=operand w standardowy SQL. Obsługiwane są binarne funkcje MIN, MAX, BETWEEN.

Google AdInline article slot
X=y        -> X = y
X<y        -> X < y
X>y        -> X > y

X!=y       -> X < y OR X > y
X<=y       -> X < y OR X = y
X>=y       -> X > y OR X = y

Dla zbiorów dwuelementowych:

X=[y1, y2]     -> (X = y1 OR X = y2)
X>[y1, y2]     -> (X > MAX(y1, y2))
X<[y1, y2]     -> (X < MIN(y1, y2))

X!=[y1, y2]    -> (X != y1 AND X != y2)
X<=[y1, y2]    -> (X <= MIN(y1, y2))
X>=[y1, y2]    -> (X >= MAX(y1, y2))

X>>[y1, y2]    -> BETWEEN(y1, y2)
X><[y1, y2]    -> (NOT BETWEEN(y1, y2))

Dla zbiorów dowolnej wielkości logika jest analogiczna: OR dla równości, AND dla negacji, MIN/MAX dla granic.

Zalety nad tablicami

Przejście od tablic JSON do ciągów upraszcza parsowanie i walidację:

Google AdInline article slot
  • Walidacja: Wyrażenia regularne zamiast sprawdzania schematów element po elemencie.
  • Kompletność: Wsparcie dla zakresów i agregacji bez rozszerzeń.
  • Czytelność: Matematyczna intuicja — X>[y1,y2] oznacza X większe od wszystkich elementów.

Przykład skrócenia:

Tradycyjny SQL: WHERE (age >= 18 AND age <= 65) OR age > 70

Notacja: age>=[18,65] OR age>70

Google AdInline article slot

Ocena od modelu AI

Analiza DeepSeek potwierdza mocne strony:

  • Kompaktowość: Wysoka gęstość bez utraty sensu.
  • Intuicyjność: X!=[y1,y2] — nierówne żadnemu.
  • Rozszerzalność: Łatwo dodać zakresy z >> (rozszerzenie) i >< (przerwa).

Potencjalne problemy:

  • Niejednoznaczność dla nowicjuszy: X>[5,10] wymaga zrozumienia MAX.
  • Puste zbiory: Trzeba zdefiniować zachowanie X=[].
  • Konflikty: >> może kolidować ze shiftami bitowymi.

Propozycje ulepszeń:

  • Alternatywy dla zakresów: X..[y1,y2], X:[y1,y2].
  • Nawiasy dla ścisłych zakresów: X>>(10,20).

Analogi i unikalność

Najbliższe odpowiedniki:

| Język/DSL | Przykład | Podobieństwo |

|-----------|----------|--------------|

| Quist | 300 <= number < 500 | Podwójne porównania, zbiory |

| SQL++ | lang IN ["en", "de"] | IN dla tablic |

| PRQL | derive full_name = ... | Podejście funkcyjne |

Unikalność notacji:

  • Strzałki >>, >< dla BETWEEN/NOT BETWEEN.
  • Kombinacje >=[y1,y2] dla granic zbiorów.
  • Minimalizm z zachowaniem ekspresyjności.

Porównanie:

  • Notacja: age>=[18,65] OR status=[active,pending]
  • Quist: (18 <= age <= 65 OR status:in active, pending)
  • SQL: (age >= 18 AND age <= 65) OR status IN ('active', 'pending')

Co ważne

  • Notacja przeznaczona dla preprocesorów SQL lub JSON DSL w backendzie.
  • Parsowanie przez regex: szybko, bez skomplikowanych parserów.
  • Wsparcie dla dowolnych typów z operacjami porównawczymi.
  • Logiczny minus dla negacji upraszcza unifikację.
  • Pierwsza wersja — do dyskusji, bez optymalizacji.

— Editorial Team

Advertisement 728x90

Czytaj dalej