Can we use OR with LIKE predicate in DB2 queries? - db2

I have a query to select names of employee start with 'y', then my query would be
SELECT EMP_NM FROM EMP
WHERE EMP_NM LIKE'Y%'
Say for example
I need to retrieve names of employee
names start with both 'y' and 'z', do
we have anything to suffice my
requirement? It's something like using
OR with LIKE, correct?
Your time and responses are highly appreciated.

WHERE EMP_NM LIKE 'Y%' OR EMP_NM LIKE 'Z%'
or, not sure if DB2 supports this (not even sure I have right link to documentation...)
WHERE EMP_NM LIKE '[YZ]%'

Related

like and not like in postgresql

I have a database table with name 'student' and have column 'name'.
I want to retrieve the names of students starting without a title 'miss' but starting with 'miss'.
I did:
select name from students where lower(name) like 'miss%' and name not like 'miss %'
The above query returns names with title also.
Any help will be highly appreciated.
do you maybe just need lower() around "name" the second time? For me with Postgres 9.5 your query works, if you say "and lower(name) not like 'miss %'

POSTGRES SELECT AS

I am joining two tables house and tower, both have some of the same column names such as id, created_at, deleted, address etc. I wonder if it is possible to return the columns in the following fashion: house.created_at, house.id, tower.created_at, tower.id etc. I know I can query with AS, I was wondering if it is possible to query something like this: SELECT house.* AS house, tower.* AS tower. I tried it like this, but it was not valid SQL. Any idea how I can chase the column names prefix easily ?

Get PostgreSQL statistics for all tables?

I have seen that PostgreSQL have several statistics depending on every table's OID (like the number of inserts, and so) 1.
What I am looking for is some kind of SELECT query or something that would sum up everything for every table.
It would be something like:
SELECT SUM(pg_stat_get_db_tuples_returned(SELECT oid FROM pg_class));
Or something like that. I would apreciate any help in here.
Do you mean this:
SELECT SUM(pg_stat_get_db_tuples_returned(oid))
from pg_class;
Something like this, with your choice of stats function, aggregates the stats function on all tables except temporary and system catalog tables:
SELECT
sum(pg_stat_get_db_tuples_returned(c.oid))
FROM pg_catalog.pg_class c
INNER JOIN pg_namespace n ON (c.relnamespace = n.oid)
WHERE NOT (n.nspname LIKE ANY(ARRAY['pg_temp%','pg_catalog','information_schema']));
Note that pg_toast schemas are included in this, as I presume you want your stats to include any TOAST side-tables. If you don't, add pg_toast% to the exclusions.
Edit: I was using the construct:
(quote_ident(n.nspname)||'.'||quote_ident(c.relname))::regclass
to get the table oid, but that's just silly when it's right there in pg_class; it's ridiculously roundabout as shown by a_horse_with_no_name.

Sort a text aggregate created with array_agg in postgresql

I have a table in postgresql. The following table "animals" will do to explain my problem:
name
------
tiger
cat
dog
Now I am using the following query:
SELECT
array_to_string(array_agg("name"), ', ')
FROM
animals;
The result is: "tiger, cat, dog". But I would like to sort the aggregate, before it is converted into a string. So this is the result I am hoping for:
"cat, dog, tiger".
So how can I sort an string array in postgresql 8.4 before converting it to a string. ORDER BY on the row "name" does not work and the built-in sort function processes only integer values.
Anyone a good idea, how to solve this in pure SQL?
Thanx a lot
Richard
For modern PostgreSQL (since version 9.0), you can use an ORDER BY clause in an aggregate expression:
SELECT
array_to_string(array_agg(name ORDER BY name), ', ')
FROM
animals;
Also, for your specific purpose, you can use string_agg to simplify your query:
SELECT
string_agg(name, ', ' ORDER BY name)
FROM
animals;
This will be available in PostgreSQL 9.0:
http://www.postgresql.org/docs/9.0/static/release-9-0.html, Section E.1.3.6.1. Aggregates
In the meantime, you could do something like this which may solve the problem (albeit clunky):
SELECT array_agg(animal_name)
FROM (
SELECT "name" AS animal_name
FROM animals
ORDER BY "name"
) AS sorted_animals;
Although Matthew Wood's answer is better for your case, here is a way to sort arrays in PostgreSQL 8.4 and up:
SELECT array(
SELECT unnest(array[3,2,1]) AS x ORDER BY x
);
Knowing the array and unnest functions can be handy, since it also lets you do things like "map" over an array:
SELECT array(
SELECT x*x FROM (SELECT unnest(array[1,2,3]) AS x) as subquery
);
Again, this can be yours for the price of PostgreSQL 8.4 .
Have you tried to use generate_series() on the array, and then do a SELECT...ORDER BY on that result (or just nest it inside of the SELECT) before you convert it to a string?
Still, for version 8.4, using the solution suggested by Matthew Wood, if you need to do a grouping in the outer query, the inner query should be sorted, too, for the sorting to be consistent.
SELECT family, array_agg(animal_name)
FROM (
SELECT family, "name" AS animal_name
FROM animals
ORDER BY family, "name"
) AS sorted_animals
group by family;
To update on this question, Snowflake has implemented array sorting:
SELECT
array_sort(array_agg("name")
FROM
animals;
Can also use array_sort_by to sort an object

interrogating table lock schemes in T-SQL

Is there some means of querying the system tables to establish which tables are using what locking schemes? I took a look at the columns in sysobjects but nothing jumped out.
aargh, just being an idiot:
SELECT name, lockscheme(name)
FROM sysobjects
WHERE type="U"
ORDER BY name
take a look at the syslockinfo and syslocks system tables
you can also run the sp_lock proc