Oracle 19c Database generate JSON from rows without passing field names - sql

I am trying to find a way to query relational tables, without prior knowledge about the table, to generate each row returned as a JSON object without having to execute two queries to achieve this outcome.
For example, If I have a 'Table_1' with columns a,b and c. I am seeking a way to write a single query that will return me json representing each row.
{
"a":"value of a",
"b":"value of b",
"c":"value of c"
}
At this time, I have to execute the following query to find the column names:
SELECT INTO LISTAGG(column_name,', ') from ALL_TAB_COLUMNS where TABLE_NAME="Table_1"
I then formulate a second query (on the client) based on the results of the previous query that gives me the COLUMN_NAMES
SELECT JSON_OBJECT(colnames) from Table_1;
I am trying to save 2 trips to the database by combining the two queries but to no avail. Any idea on how to make this work? I have tried so many permutations and combinations.
Tried this: won't work.
begin
SELECT INTO colnames LISTAGG(column_name,', ') from ALL_TAB_COLUMNS where TABLE_NAME='Table_1' and owner ='owner1'
select JSON_OBJECT(colnames) from Table_1 where a LIKE '%';
END;
Another failed attempt:
select JSON_OBJECT(SELECT LISTAGG(column_name,', ') from ALL_TAB_COLUMNS where TABLE_NAME='Table_1' and owner ='owner1') from Table_1 where a LIKE '%'

Related

How can I select sqlite "check ... in [list]" options in SQLite?

Pretty much everything is in the title.
I'm looking for an SQLite equivalent of the following SQL command :
show columns from users where field = "category";
Given that the show statement doesn't exist in SQLite.
Thanks in advance
You can use meta data held in SQLite with query:
select
sm.name as table_name,
pti.name as column_name
from
sqlite_master sm
join
pragma_table_info(sm.name) as pti
where
pti.name like '%category%';
It returns (as can be seen) tables with column names. Then, you can filter output by column name, I used for example condition:
where pti.name like '%category%'
which returns only those column names including category.

Error says table doesn't exist in database, while it exists

I have extracted list of names of tables in database using this sql query:
"SELECT table_name from information_schema.tables"
I got this list:
table_name
1 main_table
2 kp_table
3 ids_table
4 main_logs
Then i want to extract table ids_table:
"SELECT * from ids_table"
So desired result is to get that table, but i get this error:
Error: Failed to prepare query: ERROR: relation "ids_table" does not exist
LINE 1: SELECT * from ids_table
Why it happens? Why i get from first query its name, but then it tells me that it doesn't exist?
In this case, I would say that the most common issue is that you are looking at two different databases. That is probably not the cause in this case.
Another common possibility is that the schema is something unexpected, and you should be referencing the schema. For that, include the schema in the query:
select table_schema, table_name
from information_schema.tables
Another possibility are hidden characters, such as spaces. You can see if this is the problem by adding delimiters so check the names:
select '|' || table_name || '|'
from information_schema.tables
It looks like you are trying to select data from different schema, which by default owns by different user, but you have access to it. As this table is not created by user, which you are using for select * from ... , you must indicate schemas name before table name. Without schemas name it's trying to select date from users schema, but actually table are owned by completely different user.

How to select the same column from multiple table with almost same name in SQL?

I'd like to select a 2 column from lot of table.
Exemple
Table_2017-01
id name value
Table_2017-02
id name value
Table_2017-03
id name value
etc...
My Query would be
SELECT name, value
FROM Table_2017-01, Table_2017-02, Table_2017-03
But I'd like to know if something it's possible like
SELECT name, value FROM LIKE Table_%
I know this last query is not possible and it could be easier for me if a query exist for this problem as I can have a lot of table with just a part of the name different.
To select mutiple columns with the same name you have to the table as prefix like:
SELECT `Table_2017-01.name`, `Table_2017-02.name`, `Table_2017-03.name` FROM Table_2017-01,`Table_2017-02, Table_2017-03
If you want them in one Column, use Union.
(SELECT `Table_2017-01.name` from Table_2017-01)
Union
(SELECT `Table_2017-02.name` from Table_2017-02)
It depends on your database. Oracle f.e. has a data dictionary with all tables.
Because I know oracle better than others I use this for the example:
SELECT TABLE_NAME FROM ALL_TABLES WHERE TABLE_NAME LIKE 'Table_2017-%';
Now there are the following ways I sometimes use:
I build a list of selects and fire them into the database:
via Excel (not explained here)
via SQL
SELECT
'SELECT '''||TABLE_NAME||''' TABLE_NAME, NAME, VALUE FROM '||
TABLE_NAME
||' UNION '
FROM ALL_TABLES WHERE TABLE_NAME LIKE 'Table_2017-%';
Now you can copy the result to your database (dont forget to delete the last "UNION")
via program (python, Lazarus, c# .. whatever, same view is needed)
But pay attention: It is quick and dirty, the column names and types have to match.

Query to get columns from system.catalog table and do a select query

I am trying to build a query to fetch columns from the system.CATALOG table and to continue querying based on the resultset. I looked at a few queries but seem to be unable to find anything that satisfies my requirements. I don't have much to show, that I have tried as I don't know, how to approach this.
I am using Apache Phoenix DB. (Any SQL is also OK, as I am interested in learning.)
I have now written the query below, which will fetch me all the column names, that start with A in schema test for table element.
SELECT
COLUMN_NAME
FROM SYSTEM.CATALOG
WHERE TABLE_SCHEM = 'TEST'
AND TABLE_NAME = 'ELEMENT'
AND COLUMN_NAME LIKE 'A%'";
Now I want to use the list of columns names in an UPSERT query from the resultset of above query, to update these columns in the element table's records. So I am stuck here.
try this, it works perfect.
SELECT column_name
FROM system.catalog
WHERE table_name = 'your_table' AND key_seq IS NOT NULL
Example: To get the salt buckets on the table :
select table_name, salt_buckets
from SYSTEM.CATALOG
where salt_buckets is not null and table_name='TABLE_NAME';

Selecting column names and table names of a select statement

How can I select the column name and table name from a SQL?
I tried something like this but it didn't work:
select column_name, table_name from (select * from users);
This might sound silly, but I have a list of different SQLs and I need to extract their columns and tables into a list. So some of the statements could me:
select username, password from users
select createdate from userlog
select * from dept
...
If I can select the column name and table name of a select statement, then I should get, say for the first statement, username and password for columns and users for table name. And createdate for column and userlog for table name in the second statement.
Then if it all works, I can then loop through the list of select statements and extract their column and table names.
The below query worked for Oracle database.
SELECT COLUMN_NAME,TABLE_NAME FROM ALL_TAB_COLUMNS
You can see more about information-schema
Edit:
You may try like this:
SELECT COLUMN_NAME,TABLE_NAME FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME IN (SELECT ColumnName FROM users)
You need to parse the SQL statement so the SQL engine figures out the columns and datatypes of the columns that the statement returns.
How you do it best depends on what environment you are using. In some programming languages when you create a SqlPreparedStatement or OraCommand or whatever the object may be called, that object may have a metadata collection populated with column information after parsing.
If you are doing it in the database itself, parsing your statement with DBMS_SQL can get you the information you need. See Example 8 in the documentation at this link:
http://docs.oracle.com/database/121/ARPLS/d_sql.htm#ARPLS68205
--
Oh, and this gives you column names of the select statement. The table names I do not know of any way to get easily.