SQLParity

Seven SQL tools that never see your data

Built around one job: proving a migration copied every column correctly, without handing your table definitions to anyone. Everything runs in this tab.

SQL scratchpad

Drop in a CSV or Parquet file and query it with real SQL. DuckDB runs inside the tab, so the file is never uploaded.

orders.csv — read off your disk, not uploaded

SELECT segment, count(*) AS rows, avg(total) AS avg_total FROM orders WHERE created_at >= DATE '2026-01-01' GROUP BY segment ORDER BY rows DESC
segmentrowsavg_total
enterprise1,28448,210.55
smb9,6173,905.20
unknown4121,120.00

Bulk query generator

One template plus a pasted column list becomes one validation query per field, with the right null placeholder for each data type.

From one CREATE TABLE, 412 columns

-- 1 of 412, one per column in the CREATE TABLE SELECT 'customer_segment' AS field, count(*) AS mismatches FROM input_db a JOIN output_db b ON a.customer_id = b.customer_id WHERE coalesce(a.customer_segment, '~') <> coalesce(b.customer_segment, '~')

Schema diff

Compare the old and new definition, then check only what actually changed.

old.sql against new.sql

+ signup_channel varchar~ total_spend int → bigint− legacy_ref varchar= customer_id varchar

IN list builder

A column of values becomes a correctly quoted clause — apostrophes, backslashes and leading zeros included.

O'Brien Holdings · 007 · Müller GmbH

IN ( 'O''Brien Holdings', '007', 'Müller GmbH' )

SQL formatter

Sixteen dialects, leading or trailing commas, and a syntax check as you type.

select a.customer_id,a.customer_segment from sales a where a.dt=date '2026-01-01'

SELECT a.customer_id , a.customer_segment FROM sales a WHERE a.dt = DATE '2026-01-01'

Query optimizer

Nine checks for the shapes that scan more than they need to, each with the reason it costs something.

WHERE date(created_at) = '2026-01-01'

! the filter reads every partitiona column inside a function cannot prune

Dialect converter

Move a query between engines, with an explicit list of what it refused to guess at.

SELECT TOP 10 [name], LEN([note]) FROM [sales]

SELECT "name", LENGTH("note") FROM "sales" LIMIT 10

Your schema never leaves this tab.

No account. No upload. No server to trust. Type in the box and watch the counter below it stay at zero — the claim is measured, not asserted.

Open the builder
0 values · apostrophes doubled ('')

Sixteen dialects that disagree about quoting

The riskiest thing any of these tools does is quote a string. A wrong escape does not throw — it runs, and returns the wrong rows. So every dialect carries its own rules, and every rule is covered by tests.

PostgreSQL

"name" · ''

MySQL

`name` · '' · \\

SQLite

"name" · ''

SQL Server (T-SQL)

[name] · ''

Oracle

"name" · ''

MariaDB

`name` · '' · \\

Snowflake

"name" · '' · \\

Google BigQuery

`name` · \' · \\

Amazon Redshift

"name" · '' · \\

Amazon Athena / Trino

"name" · ''

Apache Spark SQL

`name` · \' · \\

Apache Hive

`name` · \' · \\

ClickHouse

`name` · '' · \\

DuckDB

"name" · ''

IBM Db2

"name" · ''

Standard SQL

"name" · ''

identifier quoting · how an apostrophe is escaped · whether a backslash must be doubled