The table component

A table with optional filtering and sorting. Unlike most others, this component does not have a fixed set of item properties, any property that is used will be rendered directly as a column in the table. Tables can contain rich text, including images, links, and icons. Table rows can be styled with a background color, and the table can be made striped, hoverable, and bordered.

Advanced users can apply custom styles to table columns using a CSS class with the same name as the column, and to table rows using the _sqlpage_css_class property.

Top-level parameters

align_right

Name of a column the contents of which should be right-aligned. This argument can be repeated multiple times to align multiple columns to the right. Introduced in v0.15.0.

border

Whether to draw borders on all sides of the table and cells.

class

class attribute added to the container in HTML. It can be used to apply custom styling to this item through css. Added in v0.18.0.

description

Description of the table content and helps users with screen readers to find a table and understand what it’s.

empty_description

Text to display if the table does not contain any row. Defaults to "no data".

hover

Whether to enable a hover state on table rows.

icon

Set this to the name of a column whose content should be interpreted as a tabler icon name. Used to display icons in the table. This argument can be repeated multiple times to intepret multiple columns as icons. Introduced in v0.8.0.

id

id attribute added to the container in HTML. It can be used to target this item through css or for scrolling to this item through links (use "#id" in link url).

markdown

Set this to the name of a column whose content should be interpreted as markdown . Used to display rich text with links in the table. This argument can be repeated multiple times to intepret multiple columns as markdown.

overflow

Whether to to let "wide" tables overflow across the right border and enable browser-based horizontal scrolling.

search

Add a search bar at the top of the table, letting users easily filter table rows by value.

small

Whether to use compact table.

sort

Make the columns clickable to let the user sort by the value contained in the column.

striped_columns

Whether to add zebra-striping to any table column.

striped_rows

Whether to add zebra-striping to any table row.

Row-level parameters

_sqlpage_color

Sets the background color of the row. Added in v0.8.0.

_sqlpage_css_class

For advanced users. Sets a css class on the table row. Added in v0.8.0.

_sqlpage_id

Sets the id of the html tabler row element. Allows you to make links targeting a specific row in a table.

Example 1

The most basic table.

select 
    'table' as component;
select 
    1 as a,
    2 as b;
select 
    3 as a,
    4 as b;

Result

a b
12
34

Example 2

A table of users with filtering and sorting.

select 
    'table' as component,
    TRUE    as sort,
    TRUE    as search;
select 
    'Ophir'   as Forename,
    'Lojkine' as Surname,
    'lovasoa' as Pseudonym;
select 
    'Linus'    as Forename,
    'Torvalds' as Surname,
    'torvalds' as Pseudonym;

Result

OphirLojkinelovasoa
LinusTorvaldstorvalds

Example 3

A table that uses markdown to display links

select 
    'table'         as component,
    'Documentation' as markdown,
    'icon'          as icon,
    TRUE            as sort,
    TRUE            as search;
select 
    'table' as icon,
    'Table' as name,
    'Displays SQL results as a searchable table.' as description,
    '[docs](documentation.sql?component=table)' as Documentation,
    'red'   as _sqlpage_color;
select 
    'timeline' as icon,
    'Chart'    as name,
    'Show graphs based on numeric data.' as description,
    '[docs](documentation.sql?component=chart)' as Documentation;

Result

TableDisplays SQL results as a searchable table.

docs

ChartShow graphs based on numeric data.

docs

Example 4

A table with numbers

select 
    'table'           as component,
    TRUE              as search,
    TRUE              as sort,
    'Price ($)'       as align_right,
    'Amount in stock' as align_right;
select 
    31456                 as id,
    'MIC-ROCC-F-23-206-C' as part_no,
    12                    as "Price ($)",
    5                     as "Amount in stock";
select 
    996                   as id,
    'MIC-ROCC-F-24-206-A' as part_no,
    1                     as "Price ($)",
    15                    as "Amount in stock";
select 
    131456                as id,
    'KIB-ROCC-F-13-205-B' as part_no,
    127                   as "Price ($)",
    9                     as "Amount in stock";

Result

31456MIC-ROCC-F-23-206-C125
996MIC-ROCC-F-24-206-A115
131456KIB-ROCC-F-13-205-B1279

Example 5

A table with some presentation options

select 
    'table' as component,
    TRUE    as hover,
    TRUE    as striped_rows,
    'Some Star Trek Starfleet starships' as description,
    TRUE    as small;
select 
    'USS Enterprise' as name,
    'NCC-1701-C'     as registry,
    'Ambassador'     as class;
select 
    'USS Archer' as name,
    'NCC-44278'  as registry,
    'Archer'     as class;
select 
    'USS Endeavour' as name,
    'NCC-06'        as registry,
    'Columbia'      as class;
select 
    'USS Constellation' as name,
    'NCC-1974'          as registry,
    'Constellation'     as class;
select 
    'USS Dakota' as name,
    'NCC-63892'  as registry,
    'Akira'      as class;

Result

Some Star Trek Starfleet starships
name registry class
USS EnterpriseNCC-1701-CAmbassador
USS ArcherNCC-44278Archer
USS EndeavourNCC-06Columbia
USS ConstellationNCC-1974Constellation
USS DakotaNCC-63892Akira

Example 6

An empty table with a friendly message

select 
    'table' as component,
    'Nothing to see here at the moment.' as empty_description;

Result

Nothing to see here at the moment.

Examples

Dynamic column names in a table

In all the previous examples, the column names were hardcoded in the SQL query. This makes it very easy to quickly visualize the results of a query as a table, but it can be limiting if you want to include columns that are not known in advance. In situations when the number and names of the columns depend on the data, or on variables, you can use the dynamic component to generate the table columns dynamically.

For that, you will need to return JSON objects from your SQL query, where the keys are the column names, and the values are the cell contents.

Databases offer utilities to generate JSON objects from query results

  • In PostgreSQL, you can use the json_build_object function for a fixed number of columns, or json_object_agg for a dynamic number of columns.
  • In SQLite, you can use the json_object function for a fixed number of columns, or the json_group_object function for a dynamic number of columns.
  • In MySQL, you can use the JSON_OBJECT function for a fixed number of columns, or the JSON_OBJECTAGG function for a dynamic number of columns.
  • In Microsoft SQL Server, you can use the FOR JSON PATH clause.

For instance, let's say we have a table with three columns: store, item, and quantity_sold. We want to create a pivot table where each row is a store, and each column is an item. We will return a set of json objects that look like this: {"store":"Madrid", "Item1": 42, "Item2": 7, "Item3": 0}

SELECT 'table' AS component;
with filled_data as (
  select
    stores.store, items.item,
    (select coalesce(sum(quantity_sold), 0) from store_sales where store=stores.store and item=items.item) as quantity 
  from (select distinct store from store_sales) as stores
  cross join (select distinct item from store_sales) as items
  order by stores.store, items.item
)
SELECT 
    'dynamic' AS component,
    JSON_PATCH( -- SQLite-specific, refer to your database documentation for the equivalent JSON functions
        JSON_OBJECT('store', store),
        JSON_GROUP_OBJECT(item, quantity)
    ) AS properties
FROM 
    filled_data
GROUP BY 
    store;

This will generate a table with the stores in the first column, and the items in the following columns, with the quantity sold in each store for each item.

See also: other components