OmniSelect FileSQL

Guides
← Back to App
HomeGuides › Plain English to SQL

Plain English to SQL, With No AI

Type total salary by department and the SQL appears as you finish the sentence. No language model is involved, no API key, no per-query cost, and nothing about your file — not even a column name — leaves the browser tab.

Why That Last Part Matters

Every other text-to-SQL box you have used is a network call. To turn your question into SQL, the service needs to know what your columns are called, so your schema goes in the request. Many send sample rows as well, to work out what the values look like. That is a reasonable engineering decision and a serious problem if the file is a client extract, a payroll export or a patient list.

This one works differently. It reads your file where the file already is, builds a picture of the tables and columns in memory, and matches your sentence against that picture using an ordinary parser. There is no request to make, so there is nothing to intercept, log or leak.

💡 You can check this rather than believe it. Open the browser's network panel, keep it recording, and type a few questions. The request count does not move. The full verification guide walks through it.

Using It

  1. Add a file. Drag it onto the File Select panel. It becomes a SQL table named by a single letter, shown in the Alias column — employees.csv becomes E.
  2. Type your question in the Ask in Plain English box, on the left of the SQL Editor.
  3. Read the SQL that appears on the right. It is ordinary SQL, and it is editable — correct it, extend it, or ignore the English box entirely from that point.
  4. Run it with the Run Query button or Ctrl+Enter.

The SQL regenerates about a third of a second after you stop typing. There is no Generate button to press.

Add a file and ask it something.

Open the tool →

What It Understands

These are run against a 48-row employees.csv with the columns employee_id, first_name, last_name, department, city, salary and hire_date. The SQL shown is exactly what appears in the editor.

What you typeWhat you get
total salary by departmentSELECT department, SUM(salary) AS total_salary FROM E GROUP BY department
average salary by citySELECT city, AVG(salary) AS avg_salary FROM E GROUP BY city
top 5 employees by salarySELECT * FROM E ORDER BY salary DESC LIMIT 5
employees in engineeringSELECT * FROM E WHERE department = 'Engineering' LIMIT 1000
show me 3 employeesSELECT * FROM E LIMIT 3

Three Things Worth Knowing

It reads the values, not just the headers

employees in engineering becomes department = 'Engineering' — with the capital E. Nobody told it that Engineering lives in the department column, or how it is spelled in your file. It read the column, saw that it holds a small set of repeated values, and matched your word against them. That is also why the capitalisation comes out right even though you typed it in lower case.

Dates become real ranges

employees hired last year produces:

SELECT * FROM E
WHERE hire_date BETWEEN '2025-01-01' AND '2025-12-31'
LIMIT 1000

It found the date column by type rather than by name, worked out the boundaries from today's date, and wrote them out literally so the query still means the same thing when you save it and run it next month.

Spelling does not have to be right

Type total salry by departmnt and you get the same query as the correctly spelled version. Column and value names are matched by edit distance, and any correction it made is reported rather than applied silently.

Where It Stops

It is a parser with a grammar, not a model that will have a go at anything. That is a deliberate trade, and the honest shape of it is this: within what it covers it is exact and repeatable, and outside that it says so rather than inventing a query.

CoveredNot covered
Select, where, group by, having, order by, limitWindow functions, CTEs, subqueries
Inner, left, right and full joins across up to 26 filesAnything that changes data — no insert, update or delete exists here at all
Counts, sums, averages, minimums, maximumsMulti-sentence questions, or questions with a "because" in them
Relative dates: today, last week, last quarter, last yearBusiness logic it cannot see: "active customers", if nothing in the file says what active means

When it cannot place part of your sentence it tells you which words it did not use, rather than quietly dropping them and returning a confident, wrong answer.

Joins, Without Writing the Join

Load two files that share a key and ask a question that spans both. With customers.xlsx and orders.xlsx loaded as C and O, total amount by city gives:

SELECT C.city, SUM(O.amount) AS total_amount
FROM C
INNER JOIN O ON C.customer_id = O.customer_id
GROUP BY C.city

The join condition was not typed and not guessed from the column name alone. A name match is only half the evidence; the other half is checking that the values in one column actually occur in the other. Both have to agree before a relationship is used, which is what stops a quantity column being joined to a customer_id because the numbers happen to overlap.

Reasonable Questions

Is there really no model behind this?

No. There is a tokenizer, a phrase index built from your file's own column and value names, and a compiler that turns matched phrases into an abstract syntax tree, which is then printed as SQL. It is a few hundred kilobytes of JavaScript that ships with the page. The network panel is the proof, and it costs you nothing per query because there is nothing to bill.

What happens to my column names?

They stay in the tab. They are used to build an in-memory index and are discarded when you close it. No copy is stored, sent or logged.

Can I edit the SQL it writes?

Yes — the editor is editable by default and always was. The English box is a starting point, not a wrapper. Many people use it for the first draft of a query and then hand-edit from there, which is exactly the intended use.

What if it gets the query wrong?

You will see it, because the SQL is on screen before anything runs. There is a confidence note above the editor, and it says not sure · check the SQL when the match was weak. Nothing executes until you press Run.

Does it work offline?

Yes. Because there is no service to call, it behaves identically with the network disconnected. Here is that demonstrated.

Which languages does it understand?

English only, at present.

Related Guides