String sort Based on number present on that String - java

I have some data in my SQL database like
1 Group 1
2 Group 1
11 Group 1
1 Group 2
1 Group 11
And I am querying like
String sortOrder = WiSeGroupContract.ColumnEntry.COLUMN_NAME_NAME + " COLLATE NOCASE";
contentResolver.query(WiSeGroupContract.ColumnEntry.CONTENT_URI,
null,
null,
sortOrder,
from,
limit);
And I am getting the output like
1 Group 1
1 Group 11
1 Group 2
11 Group 1
2 Group 1
but I wanted to like this
1 Group 1
1 Group 2
1 Group 11
2 Group 1
11 Group 1
The sorting based on the number in the string. It should be in alphabetical and also in ascending order of numbers.
in iOS, the database sorting will give the required output.
if(!sortDescriptors)
{
sortDescriptors = [NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:EntityAttributeName ascending:YES]];
}
[self groupWithPredicate :predicate sortDescriptors :sortDescriptors start :start limit :limit];
So is there any mechanism available for this? Or after fetching data, do I need to sort again?
How are they fetching data very much fast than android from the database with this sorting mechanism?

Related

Get all results that contain the largest value in table

Let's say I have a very simple table called test:
ID AGE NAME
1 12 Bob
1 13 Bob
2 13 John
3 9 Michael
3 11 Michael
I want to return all results that have the largest AGE in the table. So for this case, the result would be the entities with the age 13:
ID AGE NAME
1 13 Bob
2 13 John
I would think something like this should exist, my thought process would have been the following (even though I know the syntax would not work):
connection.getSqlQuery()
.from(test)
.max(test.age)
.list(test.id, test.age, test.name);
What would be the proper query for this?
You can create a subquery and use it in your where clause:
// Aggregate to get the maximum age
var subQuery = connection.getSqlQuery()
.select(test.age.max())
.from(test);
connection.getSqlQuery()
.from(test)
.where(test.age.eq(subQuery))
.list(test.id, test.age, test.name);
If you use JPA, you can also use var subQuery = JPAExpressions.select(...

How to query Oracle via JDBC for an intersection

I need to check from Java if a certain user has at least one group membership. In Oracle (12 by the way) there is a big able that looks like this:
DocId | Group
-----------------
1 | Group-A
1 | Group-E
1 | Group-Z
2 | Group-A
3 | Group-B
3 | Group-W
In Java I have this information:
docId = 1
listOfUsersGroups = { "Group-G", "Group-A", "Group-Of-Something-Totally-Different" }
I have seen solutions like this, but this is not the approach I want to go for. I would like to do something like this (I know this is incorrect syntax) ...
SELECT * FROM PERMSTABLE WHERE DOCID = 1 AND ('Group-G', 'Group-A', 'Group-Of-Something-Totally-Different' ) HASATLEASTONE OF Group
... and not use any temporary SQL INSERTs. The outcome should be that after executing this query I know that my user has a match because he is member of Group-A.
You can do this (using IN condition):
SELECT * FROM PERMSTABLE WHERE DocId = 1 AND Group IN
('Group-G', 'Group-A', 'Group-Of-Something-Totally-Different')

JOOQ/SQL How to select min date based on foreign key

I have a table called Foo which contains 3 columns, (id, time, barId) and I would like to select all fields from Foo where the time (stored as a timestamp) is the lowest one in a group of barId. For example if I had
Id, time, barId
1, 10am, 1
2, 11am, 1
3, 10am, 2
4, 9am, 2
I would expect to receive back rows 1 and 4.
Currently I am using
.select(FOO.ID, FOO.TIME.min, FOO.BAR_ID)
.from(FOO)
.where()
.groupBy(FOO.BAR_ID)
.fetchInto(Foo.class);
And I am receiving an error stating column "foo.id" must appear in the GROUP BY clause or be used in an aggregate function
The issue I had was that I was not grouping by the rows I was selecting.
The working code is
.select(FOO.ID, FOO.TIME.min, FOO.BAR_ID)
.from(FOO)
.where()
.groupBy(FOO.ID, FOO.TIME, FOO.BAR_ID)
.fetchInto(Foo.class);

MongoDB How to write query for checking array of values for time intervals greater than and less than time

I have table name users, and I want to get the users between some
time intervals.
My users table
user_id,updated_at
1 100
2 200
3 300
4 400
5 500
6 600
7 700
Normal query for checking time of greater than and less than is below:
db.users.find({"updated_at":{$gt:90,$lte:200}})
I have map of timestamp for this
Map<Long,Long> timestamp: which contains values for greater than and less than time.
Now If I pass values in map like
timetampMap.put(90,200)
timetampMap.put(350,400)
timetampMap.put(560,700)
The output should be after query
select * from users where (updated_at>90 && updated_at<=200)
select * from users where (updated_at>350 && updated_at<=400)
select * from users where (updated_at>560 && updated_at<=700)
user_id,updated_at
1 100
2 200
4 400
6 600
7 700
Please help to write query according to the above requirement, I don't want to use for loop for this in code.
Use $or operator something like db.users.find({ $or: [ { updated_at:{ $gt:90, $lte:200}}, { updated_at:{ $gt:350, $lte:400}}, { updated_at:{ $gt:560, $lte:700}} ] })
This query is doing or for your different ranges.
You can read more about it here https://docs.mongodb.org/manual/reference/operator/query/or/

SQL / Hibernate Criteria - Group By Trouble

I'm having some trouble here to create an appropriate SQL query. Any help will be much appreciated!
Some background:
I have the following entities
Equipment
id
nickname
owner_indicator
{...}
EquipmentGroup_Equipment
equipment_id
equipment_group_id
EquipmentGroup
id
name
description
I need to do a SQL / JPA Hibernate query that returns me:
EquipmentGroup.name, EquipmentGroup.description, Equipment.owner_indicator
And this will be grouped by EquipmentGroup.id, so if I have 10 equipments inside the group it will return information grouped by the EquipmentGroup.
The thing is, when I have for example more than one owner_indicator inside a EquipmentGroup it will return 2 rows. This is SQL 101. But i must return only one line with a blank text instead of the Owner Indicator.
What is the easiest way to do this ? I'd be glad to have the answer in SQL, but much more than glad to have it in Criteria JPA, heh.
If it does matter, I'm using Oracle 12c.
Thanks!
EDIT
As requested, here is some data:
Equipment
id nickname owner_indicator
1 EQP01 'V'
2 EQP02 'T'
EquipmentGroup_Equipment
equipment_group_id equipment_id
1 1
1 2
EquipmentGroup
id name description
1 GRP1 Group 1
My wanted resultSet is:
Result
EquipmentGroup.name EquipmentGroup.description, Equipment.owner_indicator
GRP1 Group 1 (empty string)
That empty string would be returned because I don't want 2 rows, like
Result
EquipmentGroup.name EquipmentGroup.description, Equipment.owner_indicator
GRP1 Group 1 'T'
GRP1 Group 1 'V'
If anything more than that is needed please advise.
Thanks!
I thin k you must to use a main query on EquipmentGroup and a subquery about return data on Equipment.
If you have more than 1 equipment rows about one group you must return DISTINCT empty; if you have 1 row returns owner_indicator otherwise you can return 'None'
Try this:
SELECT DISTINCT eg.name, eg.description,
(SELECT
CASE
WHEN count(e.id) > 1 THEN DISTINCT 'EMPTY'
WHEN count(e.id) = 1 THEN e.owner_indicator
ELSE 'none'
END
FROM Equipment e
WHERE e.equipmentGroup.id = eg.id)
FROM EquipmentGroup eg

Categories

Resources