Python · SQL · Web Dev · Java · AI/ML tracks launching soon — your one platform for all of IT
Beginner

CASE WHEN — Conditional Logic

SQL's if-else statement — build custom categories, conditional columns, pivot tables, and handle complex branching logic directly inside any query

12–16 min April 2026
Section 3 · Filtering & Logic
Filtering & Logic · 3 modulesModule 16

// Part 01

Why SQL Needs Conditional Logic

Every real business question involves conditional branching. A product is "High Margin" if its margin is above 40%, "Medium" if it is 25–40%, and "Low" otherwise. An order is "Fast" if delivered within 2 days, "Standard" if 3–5 days, "Slow" if more than 5 days. An employee is in the "Senior" band if their salary is above ₹60,000, otherwise "Junior."

None of these categories exist as columns in the database. They are derived from existing values using conditional logic. In every programming language this is an if-else statement. In SQL, it is the CASE WHEN expression.

CASE WHEN is one of the most powerful and frequently used constructs in SQL. It appears in SELECT for computed columns, in WHERE for complex filters, in ORDER BY for custom sort orders, and inside aggregate functions for conditional counting and summing. Mastering it unlocks an entire class of analytical queries that are impossible without it.

// Part 02

CASE WHEN Syntax — The Two Forms

CASE WHEN has two forms. The searched CASE evaluates a condition for each WHEN — the most flexible and most commonly used form. The simple CASE compares one expression against multiple values — a cleaner shorthand when comparing a single column.

Searched CASE — full conditional expressions

Searched CASE syntax
CASE
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  WHEN condition3 THEN result3
  ELSE default_result      -- optional: what to return if no WHEN matches
END

-- Real example:
CASE
  WHEN unit_price - cost_price > unit_price * 0.40 THEN 'High Margin'
  WHEN unit_price - cost_price > unit_price * 0.25 THEN 'Medium Margin'
  ELSE 'Low Margin'
END  AS margin_band

Simple CASE — comparing one value to many

Simple CASE syntax
CASE expression
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  WHEN value3 THEN result3
  ELSE default_result
END

-- Real example:
CASE payment_method
  WHEN 'UPI'        THEN 'Digital Wallet'
  WHEN 'Card'       THEN 'Card Payment'
  WHEN 'NetBanking' THEN 'Bank Transfer'
  WHEN 'COD'        THEN 'Cash on Delivery'
  ELSE 'Unknown'
END  AS payment_category

The simple CASE is syntactic sugar for the searched CASE — CASE payment_method WHEN 'UPI' THEN ... is identical to CASE WHEN payment_method = 'UPI' THEN .... Use whichever reads more clearly for the specific situation. The searched CASE handles everything the simple CASE can, plus complex conditions that go beyond simple equality.

// Part 03

CASE WHEN in SELECT — Building Computed Categories

The most common use of CASE WHEN is inside SELECT to create a new computed column whose value depends on conditions evaluated for each row.

Loyalty tier display label

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

Product margin banding

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

Delivery speed classification

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

Order value tier

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

// Part 04

How CASE WHEN Evaluates — Short-Circuit Logic

CASE WHEN evaluates conditions top to bottom and returns the result for the first WHEN condition that is TRUE. Once a match is found, the remaining WHEN clauses are not evaluated — this is called short-circuit evaluation.

This behaviour is critical to understand for writing correct CASE expressions. Consider the margin bands query above. If a product has a 45% margin, it satisfies ALL three conditions:

Short-circuit evaluation — first match wins
-- margin = 45%

WHEN margin >= 0.40 THEN 'High'    -- TRUE: 0.45 >= 0.40 → returns 'High', stops here
WHEN margin >= 0.25 THEN 'Medium'  -- never evaluated
WHEN margin >= 0.10 THEN 'Low'     -- never evaluated
ELSE 'Very Low'                    -- never evaluated

-- Result: 'High' ✓

-- If the conditions were reversed (wrong order):
WHEN margin >= 0.10 THEN 'Low'    -- TRUE for 45% too! Returns 'Low' (wrong)
WHEN margin >= 0.25 THEN 'Medium' -- never reached
WHEN margin >= 0.40 THEN 'High'   -- never reached

Always order WHEN conditions from most specific to least specific — from the most restrictive condition to the most permissive. For range bands, order from highest threshold to lowest. For categories with overlap, put the more specific condition first.

ELSE — the default catch-all

The ELSE clause is optional. If a row matches no WHEN condition and there is no ELSE, the CASE expression returns NULL. This is a common silent bug — add an explicit ELSE to handle any unexpected values rather than letting them silently become NULL.

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…
Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…
🎯 Pro Tip
Always include ELSE in CASE expressions. If you genuinely expect no other values, use ELSE 'Unknown' or ELSE 'Other' — this makes unexpected values visible in your output rather than silently NULL. Debugging a report where some rows are mysteriously NULL is much harder than debugging one that shows 'Unknown' for unexpected values.

// Part 05

CASE WHEN in WHERE — Complex Conditional Filtering

CASE WHEN can appear in WHERE clauses to express filtering logic that would be extremely complex with AND/OR alone.

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…
Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

// Part 06

CASE WHEN in ORDER BY — Custom Sort Orders

CASE WHEN in ORDER BY lets you sort by a custom priority order rather than alphabetical or numeric order. This is essential when a business has a specific priority ranking that does not match any natural sort order.

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…
Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

// Part 07

CASE WHEN Inside Aggregate Functions — Conditional Aggregation

This is one of the most powerful SQL patterns — using CASE WHEN inside SUM, COUNT, or AVG to compute conditional aggregates. Instead of running multiple queries to count different subsets of data, you count all subsets in a single pass through the table.

Conditional COUNT — count rows matching different conditions

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…
Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

Conditional SUM — sum values only for matching rows

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

Pivot tables with CASE WHEN

Conditional aggregation is the SQL technique for creating pivot tables — transforming row values into columns. This is used constantly in reporting.

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

🎯 Pro Tip

Conditional aggregation — SUM(CASE WHEN condition THEN value ELSE 0 END) — is one of the highest-leverage SQL patterns in analytics. It replaces multiple queries with a single pass through the table, dramatically improving performance. Any time you are running the same query multiple times with different WHERE conditions and then combining the results in Excel, this pattern replaces all of that with one query.

// Part 08

CASE WHEN and NULL — Careful Handling

CASE WHEN interacts with NULL in two important ways: when testing for NULL inside WHEN conditions, and when the CASE expression itself returns NULL.

Testing for NULL inside CASE

Use IS NULL and IS NOT NULL inside WHEN conditions — never = NULL. The same rule from Module 11 applies inside CASE.

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

CASE returning NULL when no WHEN matches and no ELSE

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

Using COALESCE with CASE

When a CASE might return NULL and you want a default value, wrap the entire CASE in COALESCE:

COALESCE wrapping CASE for safe NULL handling
-- Instead of relying on ELSE, use COALESCE as a safety net
COALESCE(
  CASE payment_method
    WHEN 'UPI'  THEN 'Digital — Instant'
    WHEN 'Card' THEN 'Digital — T+1'
  END,
  'Other'     -- COALESCE replaces NULL with 'Other'
) AS settlement_type

-- Equivalent to having ELSE 'Other' in the CASE
-- Useful when you cannot modify the CASE but need a null-safe wrapper

// Part 09

Nested CASE WHEN — Multi-Dimensional Logic

CASE WHEN expressions can be nested — a THEN result can itself be another CASE expression. Use this sparingly — deeply nested CASE expressions become hard to read — but for two-dimensional logic it is sometimes the clearest approach.

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…
💡 Note
Nested CASE expressions beyond two levels become extremely difficult to read and debug. When you find yourself nesting three or more levels deep, consider whether the logic can be expressed differently — a CTE (WITH clause) that computes intermediate classifications, or breaking the logic into separate computed columns.

// Part 10

Complete Business Analytics Examples

Here are complete, production-quality analytics queries that combine CASE WHEN with everything you have learned so far.

Full product performance dashboard

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

Customer segmentation report

Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…

// Part 11

What This Looks Like at Work

You are a senior analyst at Shopify. The finance team needs a weekly GMV (Gross Merchandise Value) report that breaks down revenue by order tier, payment method category, and delivery performance — all in a single table, one row per store. Previously this took three separate queries and manual Excel work. You build it as one CASE-driven query.

3:00 PM
Requirements briefing
Finance wants: total GMV per store, GMV split by order tier (Premium above ₹1,500, Standard ₹500–1,500, Basic below ₹500), digital vs non-digital payment split, and percentage of orders delivered within 3 days. All in one row per store, one query.
3:20 PM
You build the conditional aggregation query
Every split requires a CASE WHEN inside an aggregate. The delivery percentage requires a conditional COUNT divided by total COUNT.
Loading FreshCart DB…
Ctrl + Enter to run
Loading FreshCart database in your browser…
3:55 PM
One query replaces three reports and an Excel session
The finance director opens the result and immediately has the full picture: ST009 (Austin) has the highest GMV but the lowest 3-day delivery rate. ST001 (Seattle) leads on digital payment adoption. The entire briefing happens from one query result — no manual joins, no Excel pivots, no version control issues between three spreadsheets.

🎯 Pro Tip

Conditional aggregation — SUM(CASE WHEN ... END) inside GROUP BY — is what separates SQL analysts from SQL beginners. Once you internalise this pattern, you stop running three queries and combining them in Excel. You ask: "What conditions define each metric?" and write one CASE per metric inside one GROUP BY query. This is the single highest-leverage SQL skill for analytics work at Indian tech companies.

// Part 12

Interview Prep — 5 Questions With Complete Answers

Q: What is CASE WHEN and what are its two forms?

CASE WHEN is SQL's conditional expression — equivalent to an if-else statement in programming languages. It evaluates a series of conditions in order and returns the result for the first condition that evaluates to TRUE. If no condition matches and there is an ELSE clause, the ELSE result is returned. If no condition matches and there is no ELSE, the expression returns NULL.

The searched CASE form evaluates arbitrary conditions for each WHEN: CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default END. Each condition can be any Boolean expression — comparisons, range checks, IS NULL, BETWEEN, IN, even subqueries. This is the most flexible and commonly used form.

The simple CASE form compares one expression against multiple equality values: CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default END. CASE payment_method WHEN 'UPI' THEN 'Digital' WHEN 'COD' THEN 'Cash' END is cleaner than CASE WHEN payment_method = 'UPI' THEN 'Digital' WHEN payment_method = 'COD' THEN 'Cash' END. The simple form is syntactic sugar — it is always equivalent to the searched form with equality conditions, but reads more cleanly when all conditions are simple equality checks on the same column.

Q: In what order does CASE WHEN evaluate its conditions and why does this matter?

CASE WHEN evaluates conditions strictly top to bottom and returns the result for the first condition that is TRUE — it does not evaluate subsequent conditions after finding a match. This is called short-circuit evaluation. The order of WHEN clauses is therefore critical to the correctness of the result.

The importance becomes clear with overlapping conditions. Consider classifying products by margin: a product with 45% margin satisfies both margin >= 0.25 and margin >= 0.40. If WHEN margin >= 0.25 THEN 'Medium' appears before WHEN margin >= 0.40 THEN 'High', the 45% margin product is classified as 'Medium' — incorrectly. The correct order puts the more restrictive condition first: WHEN margin >= 0.40 THEN 'High', then WHEN margin >= 0.25 THEN 'Medium'.

The professional rule: always order WHEN conditions from most specific (most restrictive) to least specific (most permissive). For numeric bands, put the highest threshold first. For boolean conditions with overlaps, put the more narrowly defined condition first. For conditions that are mutually exclusive (no overlap), order does not affect correctness but still matters for readability — put the most common or highest-priority case first. Testing your CASE expression against known edge cases — values that sit exactly at boundaries — is the most reliable way to verify the ordering is correct.

Q: What is conditional aggregation and how do you implement it?

Conditional aggregation is the technique of computing multiple different aggregate values in a single query pass by using CASE WHEN inside aggregate functions like SUM, COUNT, and AVG. Instead of running three separate queries with different WHERE conditions and combining the results, you compute all three metrics simultaneously in one GROUP BY query.

The pattern for conditional SUM: SUM(CASE WHEN condition THEN value ELSE 0 END). For each row, if the condition is true the actual value contributes to the sum; if false, 0 contributes (adding nothing). The result is the sum of values only for rows where the condition was true. For conditional COUNT: SUM(CASE WHEN condition THEN 1 ELSE 0 END) — or equivalently COUNT(CASE WHEN condition THEN 1 END) which implicitly skips NULL (the no-ELSE form returns NULL which COUNT ignores).

A concrete example: to get total revenue, delivered revenue, and cancelled revenue in one query — SELECT SUM(total_amount) AS total, SUM(CASE WHEN status = 'Delivered' THEN total_amount ELSE 0 END) AS delivered, SUM(CASE WHEN status = 'Cancelled' THEN total_amount ELSE 0 END) AS cancelled FROM orders GROUP BY store_id. This single query replaces three queries. In data warehousing, this pattern is how pivot tables are built in SQL — each pivot column is one conditional aggregate. At Indian tech companies, conditional aggregation is used constantly for daily business reports, A/B test result analysis, funnel metrics, and any dashboard that shows data split by multiple categories simultaneously.

Q: What happens when no WHEN condition matches in a CASE expression?

When no WHEN condition matches and the CASE expression has an ELSE clause, the ELSE result is returned. When no WHEN condition matches and there is no ELSE clause, the CASE expression returns NULL. This is the default behaviour defined by the SQL standard.

The danger of a missing ELSE is that it creates silent NULL values in the result. If a new value is added to a column — a new payment method, a new order status, a new product category — and the CASE expression does not have a WHEN for that value and has no ELSE, the new rows produce NULL in the computed column with no error or warning. This corrupts aggregations (SUM treats NULL as 0-excluded, AVG ignores NULLs), breaks application code that expects a non-null value, and produces misleading reports.

The professional practice: always include an ELSE in every CASE expression. For categorisation use ELSE 'Other' or ELSE 'Unknown' — this makes unexpected values visible. For numeric defaults use ELSE 0. For boolean logic use ELSE FALSE. The ELSE clause acts as a safety net: it guarantees that the CASE expression never returns NULL from a missing match, and makes unexpected values immediately visible in the output rather than silently missing. The only acceptable case for omitting ELSE is when you genuinely want NULL for unmatched rows and your downstream processing handles NULL correctly — which should be explicitly documented in a comment.

Q: Can CASE WHEN be used inside ORDER BY? Give a practical example.

Yes, CASE WHEN can be used inside ORDER BY to sort by a custom priority order rather than the natural alphabetical or numeric order of a column's values. This is one of the most useful applications of CASE WHEN in reporting contexts where business priority does not align with alphabetical or numeric sort order.

The technique: assign a numeric rank to each value using CASE WHEN and sort by that rank. ORDER BY CASE status WHEN 'Processing' THEN 1 WHEN 'Returned' THEN 2 WHEN 'Delivered' THEN 3 WHEN 'Cancelled' THEN 4 ELSE 5 END sorts orders by business priority — actionable statuses first — rather than alphabetically (Cancelled, Delivered, Processing, Returned). The numbers 1-4 are invisible in the output; they only control the sort order.

Another common example: sorting loyalty tiers by tier value (Platinum, Gold, Silver, Bronze) rather than alphabetically (Bronze, Gold, Platinum, Silver). ORDER BY CASE loyalty_tier WHEN 'Platinum' THEN 1 WHEN 'Gold' THEN 2 WHEN 'Silver' THEN 3 WHEN 'Bronze' THEN 4 END. This can be combined with additional sort keys: ORDER BY CASE loyalty_tier... END ASC, joined_date DESC — sort by tier priority first, then by most recently joined within each tier. CASE in ORDER BY is also used to put specific rows at the top or bottom: ORDER BY CASE WHEN customer_id = 42 THEN 0 ELSE 1 END sorts one specific row to the top of any result regardless of other sort criteria.

// Part 13

Errors You Will Hit — And Exactly Why They Happen

CASE expression returns wrong category — all products show 'Low Margin' even with 45% margin

Cause: WHEN conditions are in the wrong order — least restrictive first. CASE evaluates top to bottom and returns the first match. If WHEN margin >= 0.10 THEN 'Low Margin' appears before WHEN margin >= 0.40 THEN 'High Margin', a product with 45% margin matches the first WHEN (0.45 >= 0.10 is TRUE) and is classified as 'Low Margin' immediately. The 'High Margin' WHEN is never reached.

Fix: Order WHEN conditions from most restrictive to least restrictive — highest threshold first: WHEN margin >= 0.40 THEN 'High Margin', WHEN margin >= 0.25 THEN 'Medium Margin', WHEN margin >= 0.10 THEN 'Low Margin', ELSE 'Very Low Margin'. Always verify by running the query for a known edge case — a product with exactly 40% margin should return 'High Margin', one with 39.9% should return 'Medium Margin'.

Some rows show NULL in a CASE column unexpectedly

Cause: No WHEN condition matched for those rows and there is no ELSE clause. NULL is the default return value when CASE has no matching WHEN and no ELSE. This silently happens when: a new value was added to the data that is not covered by any WHEN clause, the WHEN conditions have gaps (values between thresholds that no WHEN handles), or a NULL value in the input column causes all comparisons to evaluate to NULL (NULL compared to anything is NULL).

Fix: Add an explicit ELSE clause to every CASE expression: ELSE 'Other' for text categories, ELSE 0 for numeric defaults, ELSE FALSE for boolean logic. To find which rows are returning NULL: SELECT * FROM table WHERE CASE ... END IS NULL — this identifies the unmatched rows. Check whether the column contains NULL values (which bypass all WHEN conditions) and add a WHEN col IS NULL THEN 'Unknown' as the first WHEN if needed.

ERROR: CASE types integer and character varying cannot be matched

Cause: The THEN clauses in a CASE expression return values of incompatible data types. SQL requires all THEN results (and the ELSE result) to be the same type, or types that can be implicitly converted to a common type. CASE WHEN x > 5 THEN 'High' WHEN x > 2 THEN 3 ELSE 'Low' END mixes text ('High', 'Low') with integer (3) — the database cannot determine a single common type.

Fix: Make all THEN and ELSE results the same data type. For text categories: use strings in all branches. For numeric results: use numbers in all branches. If you need to mix, CAST explicitly: CASE WHEN x > 5 THEN 'High' WHEN x > 2 THEN CAST(3 AS VARCHAR) ELSE 'Low' END — though mixing numeric and text values in a CASE result is usually a design problem. Rethink what the CASE is trying to produce and whether a separate numeric column and a separate text column would be clearer.

Conditional aggregation returns wrong totals — SUM higher than expected

Cause: The CASE inside SUM is missing the ELSE 0 clause and using NULL instead. SUM(CASE WHEN condition THEN value END) — without ELSE — returns NULL for non-matching rows. SUM ignores NULLs, so the total should be the same as SUM(CASE WHEN condition THEN value ELSE 0 END). However, if the CASE accidentally returns unexpected values for some rows due to a wrong condition, the SUM will be inflated. Also, double-counting occurs when conditions overlap — a row satisfying two conditions appears in two conditional sums.

Fix: Verify the CASE logic by running it as a SELECT column first: SELECT order_id, total_amount, CASE WHEN condition THEN total_amount ELSE 0 END AS conditional_value FROM orders — spot-check that each row's conditional_value is what you expect before wrapping in SUM. For overlap detection: SELECT order_id, COUNT(*) FROM orders WHERE condition1 OR condition2 GROUP BY order_id HAVING COUNT(*) > 1 — any row appearing twice is being double-counted.

CASE in WHERE does not filter correctly — returns all rows or too few rows

Cause: CASE WHEN in WHERE must evaluate to TRUE for the row to be included. A common mistake is having the CASE return a string ('Yes'/'No') and comparing it to TRUE, or having the CASE return a value the WHERE clause does not evaluate as TRUE. WHERE CASE WHEN x > 5 THEN 'Yes' ELSE 'No' END does not filter anything — it evaluates the string 'Yes' or 'No' as a condition, which in PostgreSQL is a type error, and in MySQL both non-empty strings might be truthy.

Fix: CASE in WHERE should either return a boolean: WHERE CASE WHEN x > 5 THEN TRUE ELSE FALSE END, or be compared explicitly: WHERE CASE WHEN x > 5 THEN 'Yes' ELSE 'No' END = 'Yes'. The boolean form is cleaner and more portable. Alternatively, consider whether the CASE in WHERE can be rewritten as a simpler condition or as separate OR conditions — CASE in WHERE is often more complex than needed and a straightforward WHERE clause with AND/OR is more readable.

Try It Yourself

Write a single query that produces a store performance summary for FreshCart management. For each store show: store_id, city, total delivered orders, total delivered revenue (rounded to 2 decimal places), the revenue from high-value orders (above ₹1,000) as high_value_revenue, a performance_band column using CASE: 'Star' if total delivered revenue above ₹3,000, 'Good' if above ₹1,500, 'Needs Support' otherwise. Sort by total delivered revenue descending.

🎯 Key Takeaways

  • CASE WHEN is SQL's if-else expression. It evaluates conditions top to bottom and returns the result for the first TRUE condition. It can appear in SELECT, WHERE, ORDER BY, and inside aggregate functions.
  • Two forms: searched CASE (CASE WHEN condition THEN result) for arbitrary conditions, and simple CASE (CASE expression WHEN value THEN result) for equality checks against one column. Both produce identical results for equality conditions.
  • Evaluation is top-to-bottom with short-circuit: the first matching WHEN wins and remaining WHENs are skipped. Order WHEN conditions from most restrictive to least restrictive.
  • Always include ELSE. Without it, unmatched rows return NULL silently — breaking aggregations, application code, and reports. Use ELSE 'Other', ELSE 0, or ELSE FALSE as appropriate.
  • CASE WHEN in ORDER BY enables custom sort priorities: ORDER BY CASE status WHEN 'Processing' THEN 1 WHEN 'Delivered' THEN 2 END — sorts by business priority, not alphabetically.
  • Conditional aggregation — SUM(CASE WHEN condition THEN value ELSE 0 END) — computes multiple metrics in one query pass. It replaces running the same query repeatedly with different WHERE conditions.
  • Pivot tables in SQL use conditional aggregation: each pivot column is one CASE WHEN inside SUM or COUNT, grouped by the row dimension.
  • NULL handling inside CASE: use IS NULL and IS NOT NULL in WHEN conditions — never = NULL. When the column being tested is NULL, all comparisons return NULL and no WHEN matches.
  • All THEN and ELSE results must be the same data type or implicitly castable to a common type. Mixing text and numeric results causes a type error.
  • Conditional aggregation is the highest-leverage CASE WHEN skill for analytics. Any report that shows data split by multiple categories simultaneously uses this pattern — master it and you eliminate entire categories of manual Excel work.

What comes next

In Module 18, you learn about data types in SQL — what types exist, which to use for which data, and how type mismatches cause silent bugs in calculations and comparisons.

Module 18 → SQL Data Types
Share

Discussion

0

Have a better approach? Found something outdated? Share it — your knowledge helps everyone learning here.

Continue with GitHub
Loading...