OmniSelect FileSQL

How To Use Guide
← Back to App

Overview

OmniSelect FileSQL is a fully client-side SQL query tool. Your files are never uploaded to any server — all parsing and querying happens entirely in your browser. Load one or more files, write SQL, and get results instantly.

Step 1 — Select Files

Click Choose files (or anywhere in the File Select panel), or drag and drop files onto the page. You can load multiple files at once to join them with SQL.

Supported File Types

FormatExtensionsNotes
CSV / TSV / TXT.csv, .tsv, .txtConfigurable delimiter, quote, record separator
Excel.xlsx, .xls, .xlsm, .xlsb, .xltx, .xltm, .xltChoose sheet, skip rows, header row supported
Other spreadsheets.ods, .dbf, .wks, .wk1, .wk3, .wk4OpenDocument, dBase / FoxPro and Lotus 1-2-3; choose sheet, skip rows, header row supported
JSON.jsonNested objects/arrays are flattened with dot-path columns
JSON Lines.jsonl, .ndjsonOne JSON record per line, flattened the same way as JSON; blank lines are skipped
XML.xmlNested elements flattened to dot-path columns
YAML.yaml, .ymlNested structures flattened
Avro.avroParsed via WebAssembly; uncompressed, deflate and snappy files
Parquet.parquetParsed via WebAssembly + Apache Arrow
Arrow / Feather.arrow, .feather, .ipc, .arrowsApache Arrow IPC files and streams. Compressed files (the pyarrow default) are refused: save with compression="uncompressed", or as Parquet
SQLite.sqlite, .sqlite3, .db, .db3, .gpkgChoose the table or view in the Sheet column. Read by SQLite itself (sql.js); encrypted databases are refused
Microsoft Access.accdb, .mdbEach table gets its own row, like the files in a ZIP, shown as shop.accdb › Orders with its own alias. Currency and decimal columns become numbers; password-protected databases are refused
SPSS.sav, .zsav, .porDates become dates. A variable with value labels also gets a <name>_label column (1 → Control); user-missing values are empty
SAS.sas7bdat, .xptData sets and transport files; date, datetime and time formats become text dates and times
Stata.dtaDates (%td, %tc, %tm, %tq …) become dates; value labels get a _label column
MongoDB BSON.bsonA mongodump file: ObjectIds become text, nested documents are flattened like JSON
MessagePack, CBOR.msgpack, .mpk, .cborOne list of records, or records one after another; flattened like JSON
Gzipped.csv.gz, .json.gz, .jsonl.gz, .xml.gz, .yaml.gz …Any format above, gzip-compressed. Unpacked by your browser’s built-in decompressor; name the file after the one inside (orders.csv.gz). The 50 MB limit applies to the unpacked size. More on .gz files
ZIP and TAR.zip, .tar, .tar.gz, .tgzEvery readable file inside is added as its own row and table, shown as archive.zip › orders.csv. Up to 50 MB per file and 200 MB for the whole archive once unpacked; password-protected and ZIP64 archives are refused

File Row Options

OptionApplies ToDescription
AliasAllSingle letter (A–Z) used as the table name in SQL. It is taken from the start of the filename, so orders.csv becomes O and you query it with SELECT * FROM O. If two files would claim the same letter, the second gets another free one. Editable — type whichever letter you prefer.
SheetExcelSelect which worksheet to load
Column DelimiterCSV/TSV/TXTComma, Tab, Pipe, or custom character
Quote CharacterCSV/TSV/TXTCharacter used to wrap quoted fields
Record DelimiterCSV/TSV/TXTLF, CR, or CRLF line endings
Skip RowsCSV/TSV/TXT/ExcelNumber of rows to skip from the top before reading data
Header RowCSV/TSV/TXT/ExcelWhen checked, first (non-skipped) row is used as column names
💡 Column headers with spaces are automatically converted to underscores. A column named first name becomes first_name in SQL.
💡 Numeric-looking values (e.g. "42", "3.14") are automatically coerced to numbers so you can write WHERE age = 30 instead of WHERE age = '30'.

Step 2 — Write SQL

Use the SQL Editor to write standard SQL queries. The editor supports syntax highlighting. Each loaded file is available as a table using its alias letter.

Basic Examples

-- Select all rows from file A
SELECT * FROM A

-- Filter with a number column
SELECT * FROM A WHERE age > 25

-- Filter with a text column
SELECT * FROM A WHERE city = 'New York'

-- Select specific columns
SELECT first_name, last_name, salary FROM A WHERE salary > 50000

-- Order results
SELECT * FROM A ORDER BY last_name ASC

-- Aggregate
SELECT department, COUNT(*) as headcount, AVG(salary) as avg_salary
FROM A
GROUP BY department

Joining Multiple Files

Load two files — they get aliases A and B (or whatever letters are assigned). Then join them:

-- Inner join
SELECT A.order_id, A.amount, B.customer_name
FROM A
JOIN B ON A.customer_id = B.id

-- Left join
SELECT A.*, B.region
FROM A
LEFT JOIN B ON A.region_code = B.code
💡 When joining, qualify column names with the table alias (e.g. A.column_name) to avoid ambiguity.

Nested JSON/XML/YAML Columns

Nested structures are flattened using dot-path names. For example, a JSON field address.city becomes a column. In the results table, the short alias is shown on top with the full path below it.

-- Query a nested field
SELECT name, address_city FROM A WHERE address_city = 'Austin'

SQL Functions Supported

Queries run on DuckDB, compiled to WebAssembly and running inside this browser tab. Commonly used functions include:

CategoryFunctions
AggregateCOUNT, SUM, AVG, MIN, MAX
StringUPPER, LOWER, TRIM, SUBSTRING, CONCAT
ConditionalCASE WHEN … THEN … ELSE … END, COALESCE, IFNULL, NULLIF
Datesyear, month, date_trunc, strftime, and date arithmetic such as order_date + INTERVAL 7 DAY
WindowROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, running totals with SUM(…) OVER (ORDER BY …), and QUALIFY to filter on them
FilteringLIKE, IN, BETWEEN, IS NULL, IS NOT NULL
ClausesWHERE, GROUP BY, HAVING, ORDER BY, LIMIT, OFFSET, WITH (common table expressions)

Text values go in single quotes: WHERE city = 'Austin'. Double quotes around a word that is not a column name are read as text too, so queries written for earlier versions of this tool keep working — except where only a column name makes sense (before = or IS, in the SELECT list, after ORDER BY): there a misspelt name is reported, not quietly compared as text.

Step 3 — Run the Query

Click the Run Query button. Results appear in the Query Results panel below. The Row limit box beside Export sets how many rows a query brings back: 1,000 unless you change it, and a note above the results says when there were more. Results over 1,000 rows are paginated at 1,000 rows per page — use the Previous / Next buttons to navigate. An export always holds every row of the result, whatever the Row limit. A query that is taking too long can be ended with the Stop button beside Run Query.

⚠️ Files are limited to 50MB each, and to 1,000,000 rows as a safety backstop. If a file is truncated, a notice appears above the results — truncation is never silent.

Step 4 — Export Results

Click the Export button in the Query Results panel to download results in your preferred format:

FormatDescription
CSVComma-separated values, opens in Excel or any text editor
JSONArray of objects, useful for APIs or further processing
Excel.xlsx file with results on a single sheet
ParquetColumnar .parquet file — numeric columns stay numeric, dates stay dates, everything else is written as text

Tips & Tricks

Privacy

All processing is done entirely in your browser. No data is sent to any server. Files remain on your machine at all times.