SQL checking the last letter in string / AKA LIKE strange behaviour - sql

I know it was already answered but it doesn't work for me.
So quick introduce:
I have table called swimmers. I'll insert new record to it which fulfils all columns:
INSERT INTO swimmers(id, first_name, last_name, age, gender)
VALUES(9,'Maria','Spolsky',34,'Female');
Now I want to find records in swimmers table which first_name DOES NOT end with letter a and where gender is Female
So I wrote SQL query:
SELECT first_name, last_name
FROM swimmers
WHERE first_name NOT LIKE '%a' AND gender = 'Female'
But it does return Maria which we just added. It basically returns every female
I'm using ORACLE iSQL plus.
EDIT:
I tried to use substr(first_name, -1) = 'a' but it turned out that -1 is empty, because I use varchar(20) and names are usually smaller than 20 characters
EDIT2:
I tried to find issue in data type. I used char(20) for first_name.
I changed it into varchar2(20):
ALTER TABLE swimmers
MODIFY first_name varchar2(20);
but didn't solve the issue
EDIT 3:
Changing NOT LIKE to WHERE first_name LIKE '%a' returns no rows. I believe issues lies inside data type and empty spaces from the end of the first_name to the end of reserved space for string (names has ~10 characters and I use `varchar2(20))

Appearantly oracles is adding spaces behind the name and that's why '%a' doesn't work, either change your column definition to a varchar (so oracle doesn't add the extra spaces) or trim the spaces out of your name like this:
SELECT first_name, last_name
FROM swimmers
WHERE NOT trim(first_name) LIKE '%a' AND gender = 'Female';

Related

Oracle Live SQL: SQL command not properly ended

I want to show first_name, last_name columns and make UPPER-CASE LETTERS for those entries who have the letter 's' in the last name.
I am getting
ORA-00933: SQL command not properly ended
error. Anyone has an idea where I go wrong and How do I fix it?
SELECT first_name, last_name FROM CUSTOMERS
WHERE last_name LIKE "S"
UPDATE CUSTOMERS
SET
first_name = UPPER(first_name)
last_name = UPPER(last_name)
You seem to want:
UPDATE CUSTOMERS
SET first_name = UPPER(first_name), last_name = UPPER(last_name)
WHERE last_name LIKE '%S%'
It is unclear whether you want to match on upper-case or lower-case "s" in the name. If you want both, then:
WHERE UPPER(last_name) LIKE '%S%'
try putting "%S" instead of "S". If you put "S" it will only show you results for surnames that are just the letter S
Try following with subquery:-
UPDATE CUSTOMERS
SET ( first_name , last_name ) = (SELECT UPPER(first_name) , UPPER(last_name) FROM CUSTOMERS )
WHERE UPPER(last_name) LIKE 'S'
However, if you want all last_name starting with S then add wildcard such as
WHERE UPPER(last_name) LIKE 'S%'

How to get length of string using Oracle query

In a table I have columns FIRST_NAME and LAST_NAME. I have to concatenate the two names and retrieve names containing more than 12 characters.
I tried the following query:
select *
from (select first_name, last_name
from customer as name
)
where length(NAME) = 12
Select *
from (
select first_name||last_name as name
from customer
)
where length(name)>12
You need only one SELECT
SELECT first_name || last_name AS name
FROM customer
WHERE LENGTH(first_name||last_name) > 12
Optionally TRIM name and last_name from spaces.
As an alternative, if you rewrite your question to check if the total length of first name and last name is more than 12, you probably get a different response from people with a more efficient code. It is not necessary to make Oracle actually concatenate the columns.
Programmers are too literal these days. :)
You are not concatenating the first name and last name.
Also no need to write an inline view, below is the query.
select FIRST_NAME || LAST_NAME as NAME
from CUSTOMER
where length(FIRST_NAME || LAST_NAME) > 12;

SQL prompt to enter a letter that the last name starts with

The whole question is:
Rewrite the query so that the user is prompted to
enter a letter that the last name starts with. For example, if the user enters “H" (capitalized) when prompted for a letter, then the output should show all employees whose last name starts with the letter “H.”
SELECT last_name
FROM employees
WHERE last_name like '%' = &Start_Letter
This wont work :(
This query should work:
SELECT last_name FROM employees WHERE last_name like '&Start_Letter%';
I have tested it in Oracle11g.
SELECT last_name FROM employees WHERE last_name like &Start_Letter + '%';
Depending on the requirements of your particular application, a more efficient solution might be to create a function based index:
CREATE INDEX emp_start_letter_idx
ON employees ( substr( last_name, 1, 1 ) );
Then your query would be:
SELECT last_name
FROM employees
WHERE substr(last_name, 1, 1) = '&Start_Letter';
Likewise, depending on your requirements, this may be a lot of unnecessary fuss!

Search Results Rails SQL - Searching for users

I have a search field in my navigation bar where people can search for other users, like fb's friend search.
In my Users table i have first_name and last_name as columns and would like the search results to look through both tables. Right now I just have it working with the first name.
#usersfiltered = User.where("first_name LIKE?", "%#{params[:first_name]}%" )
Ideally, if there was an user named Bob Smith his name would come up if Bob, Smith, or Bob Smith was searched.
How would you go about adding to the SQL statement? I've tried a few things but keep getting errors. Thanks
You can use a symbol in your where method to pass in one value for multiple column like this:
#usersfiltered = User.where("first_name LIKE :search_name or last_name LIKE :search_name",
search_name: "%#{params[:search_word]}%" )
Update:
To search for first_name and last_name combined, you could concatenate the two fields and add another OR condition.
The problem here is different databases have their own concatenation style. Following are for MySQL and Postgres.
MySQL:
#usersfiltered = User.where("first_name LIKE :search_name or last_name LIKE :search_name or concat(first_name, ' ', last_name) like :search_name",
search_name: "%#{params[:search_word].squish}%" )
Postgres:
#usersfiltered = User.where("first_name LIKE :search_name or last_name LIKE :search_name or (first_name || ' ' || last_name) like :search_name",
search_name: "%#{params[:search_word].squish}%" )
I also added the Ruby string function squish, to take care of extra spaces.
#usersfiltered = User.where("first_name LIKE ? OR last_name LIKE ?", "%#{params[:first_name]}%", "%#{params[:last_name]}%")
However, if you have just one field that the user is typing into and you want to use it to search multiple names, I would think you'd want to name it something else besides "first_name" and use the approach described in the other answer.

How Do I SELECT when needing to use LIKE and change column Name

Here is the problem I am working on:
Select all the Oracle database employees whose last names end with “s” Change the
heading of the column to read Possible Candidates.
I tried
SELECT last_name AS possible_candidates FROM * WHERE last_name LIKE '%s';
That returned the error :
ORA-00903: invalid table name
Unless I am reading the question wrong how do I check the entire database for something like this?
To answer the question which is asking for employee names not just last names you would select all employees with a last name that ends in S.
SELECT *
FROM employees
WHERE last_name LIKE '%s'
If the table has more than a first_name and last_name column you can do
SELECT first_name, last_name
FROM employees
WHERE last_name LIKE '%s'
Now to combine your two parts (Select employees and rename column)
Run one of the two queries above but add an AS statement as show in the example below.
SELECT *
AS Possible_Candidates
FROM employees
WHERE last_name LIKE '%s'
Based on feedback: this appears to be your answer...
Is there a table called employees? if that I would interpret the question as from the employees table. Otherwise, you could select table_name from All_TAB_COLS where column_name like = 'LAST_NAME' and then build a union from the resulting tables all of which have a field called 'LAST_NAME'