use ltrim and itrim - sql

I want to write a stored procedure in order to filter some columns in which some of them might be NULL or not. code below is mine, but it does not work.
procedure .[s p_organization](#expert nvarchar(100),
#name nvarchar(100), #last_name nvarchar(200),
#organization n varchar(200) )
where
((Person.expert LIKE #expert or Person.expert LIKE #expert)
and (is null(l trim(r trim #last_name)),'')=''
or person.last_name like #last_name + '%'
and Person.Name LIKE #name
or #name is null
and Organization.Name LIKE N'%'+#organization +'%' )

Add ( ) when using or and and mixed:
A AND B OR C will return C totally independent of A AND B.
A AND (B OR C) will returnA AND BorA AND C` (depending on the content of the data
In your case:
((Person.expert LIKE #expert or Person.expert LIKE #expert)
and ((is null(l trim(r trim #last_name)),")="
or person.last_name like #last_name + '%')
and (Person.Name LIKE #name
or #name is null )
and Organization.Name LIKE N'%'+#organization +'%' )
might work better (you need to tune it for your own purposes and results

Related

Stored procedure ignoring Nulls and fetch result for only entered parameters

I am creating a stored procedure to do a search through a table. I have many different search columns, all of which are optional. Is there a way to create a stored procedure that will handle this? Let's say I have a table with four columns ID, N1, N2 and N3. I could do something like this:
Table:
INSERT INTO [dbo].[Sample]
VALUES ('1', 'A,B,C', 'A,B,C', 'A,B,C'),
('2', 'B,D,N', 'B,D,N', 'B,D,N'),
('3', 'A,N,S', 'A,N,S', 'A,N,S'),
('4', 'S,F,G', 'S,F,G', 'S,F,G'),
('5', 'D,F,K', 'D,F,K', 'D,F,K'),
('6', 'S,H,Y', 'S,H,Y', 'S,H,Y'),
('7', 'Z,B,C', 'Z,B,C', 'Z,B,C')
Stored procedure:
CREATE PROCEDURE dbo.Sample2
#n11 varchar(max) = null,
#n12 varchar(max) = null,
#n21 varchar(max) = null,
#n22 varchar(max) = null,
#n31 varchar(max) = null,
#n32 varchar(max) = null
AS
BEGIN
SELECT COUNT(*)
FROM Sample
WHERE
(#n11 IS NULL OR Sample.N1 LIKE '%' + #n11 + '%'
OR #n12 IS NULL OR Sample.N1 LIKE '%' + #n12 + '%')
AND (#n21 IS NULL OR Sample.N2 LIKE '%' + #n21 + '%'
OR #n22 IS NULL OR Sample.N2 LIKE '%' + #n22 + '%')
AND (#n31 IS NULL OR Sample.N3 LIKE '%' + #n31 + '%'
OR #n32 IS NULL OR Sample.N3 LIKE '%' + #n32 + '%')
END
If user enters #n11 as A and leave the rest, since N1 contains A in 2 rows, output should be 2 but above query is providing 7. If a parameter is not specified, I need that to be ignored and pass the rest to where condition.
I think you need to AND every separate input condition e.g.
SELECT count(*)
FROM [Sample] S
WHERE (#n11 IS NULL OR S.N1 LIKE '%'+#n11+'%')
AND (#n12 IS NULL OR S.N1 LIKE '%'+#n12+'%')
AND (#n21 IS NULL OR S.N2 LIKE '%'+#n21+'%')
AND (#n22 IS NULL OR S.N2 LIKE '%'+#n22+'%')
AND (#n31 IS NULL OR S.N3 LIKE '%'+#n31+'%')
AND (#n32 IS NULL OR S.N3 LIKE '%'+#n32+'%')
Note the alias, which is the best practice way to avoid having to repeat a long table name all over the query.
Try to remove the next conditions from your stored procedure query:
#n12 IS NULL
#n22 IS NULL
#n32 IS NULL
As the above conditions are returning always true while there were sent when calling the procedure.
Stored procedure code after modified:
Alter Procedure dbo.Sample2
#n11 varchar(max) = null,
#n12 varchar(max) = null,
#n21 varchar(max) = null,
#n22 varchar(max) = null,
#n31 varchar(max) = null,
#n32 varchar(max) = null
AS
BEGIN
select count(*)
from Sample
where (#n11 IS NULL OR Sample.N1 LIKE '%'+#n11+'%' OR Sample.N1 LIKE '%'+#n12+'%')
AND (#n21 IS NULL OR Sample.N2 LIKE '%'+#n21+'%' OR Sample.N2 LIKE '%'+#n22+'%')
AND (#n31 IS NULL OR Sample.N3 LIKE '%'+#n31+'%' OR Sample.N3 LIKE '%'+#n32+'%')
END
Now while executing exec dbo.Sample2 #n11 = 'A' the output will be 2 instead of 7
select
sum(iif(N1 like '%'+#N11+'%',1,0)
+ iif(N1 like '%'+#N12+'%',1,0)
+ iif(N2 like '%'+#N21+'%',1,0)
+ iif(N2 like '%'+#N22+'%',1,0)
+ iif(N3 like '%'+#N31+'%',1,0)
+ iif(N3 like '%'+#N32+'%',1,0)
)
from Sample
Any NULL variables will be ignored.

T-SQL wild card brings back no results

This returns 110 results:
select *
from regions
where sponsor like '%'
This returns zero results and should return 110 records:
declare #sponsor char(4)
set #sponsor = '%'
select *
from regions
where sponsor like #sponsor
You are using a CHAR(4), it means that when you do:
declare #sponsor char(4)
set #sponsor = '%'
The actual value of sponsor is '% '. Either use CHAR(1) or VARCHAR(4)
char types are padded with whitespace. Your second query is actually equivalent to this:
select * from regions where sponsor like '% '
Make #sponsor a char(1) or a varchar(4).

Using Stored Procedure variable in Like statement

I can't seem to properly use the LIKE statement using a variable from a stored procedure. I want to find all the rows from a table that start with the variable passed.
I am currently using the following query where #id is the value passed to the stored procedure as nvarchar(20). This works fine when the IDs completely match, but does not properly use the '%' appended. What is the proper way to complete this task?
SELECT * FROM Table WHERE id LIKE #id + '%'
This works for me:
declare #id nvarchar(20)
select #id = '1'
SELECT * FROM tab WHERE id LIKE #id + '%'
Sql Fiddle DEMO
The query doesn't work if #id is null. So what you can do is set it to empty string if #id is null. Please try the following:
begin
declare #id nvarchar(20)
set #id = isnull(#id, '')
select * from table where id like #id + '%'
end
So in your procedure, adding the following line should work for your query:
set #id = isnull(#id, '')
Simple solution:
$search_q = '%' . $this_search_q. '%';
$stmt = $db->prepare("SELECT * FROM tbl_tablename WHERE tablecollumn LIKE :id");
$stmt ->bindParam(":id", $search_q );
$stmt->execute();
OR
$search_q = '%' . $this_search_q. '%';
$stmt = $db->prepare("SELECT * FROM tbl_tablename WHERE tablecollumn LIKE $search_q");
$stmt->execute();
CREATE PROCEDURE `SP_GENRE_SELECT`(
IN _Id INTEGER,
IN _Name VARCHAR(50),
IN _account VARCHAR (50),
IN _Password VARCHAR (50),
IN _LastConnexionDate DATETIME,
IN _CreatedDate DATETIME,
IN _UpdatedDate DATETIME,
IN _CreatedUserId INTEGER,
IN _UpdatedUserId INTEGER,
IN _Status TINYINT
)
BEGIN
SELECT *
FROM user
WHERE Id LIKE _id IS NULL + '%',CAST(_Id AS VARCHAR)
AND
WHERE Name LIKE _Name IS NULL + '%' ,'%',CONCAT('%',_Name,'%')
AND
WHERE Account LIKE _Account IS NULL + '%' ,'%',CONCAT('%',_Account,'%')
AND
WHERE LastConnexionDate LIKE _LastConnexionDate IS NULL + '%' ,'%',CONCAT('%',CAST(LastConnexionDate AS VARCHAR(50),'%'))
AND
WHERE CreatedDate LIKE _CreatedDate IS NULL + '%' ,'%',CONCAT('%',CAST(_CreatedDate AS VARCHAR(50),'%'))
AND
WHERE UpdatedDate LIKE _UpdatedDate IS NULL + '%' ,'%',CONCAT('%',CAST(_UpdatedDate AS VARCHAR(50),'%'))
AND
WHERE CreatedUserID LIKE _CreatedUserID IS NULL +'%' ,'%',CONCAT('%',CAST(_CreatedUserID AS VARCHAR(50),'%'))
AND
WHERE UpdatedUserID LIKE _UpdatedUserID IS NULL +'%' ,'%',CONCAT('%',CAST(_UpdatedUserID AS VARCHAR(50),'%'))
AND
WHERE Status LIKE _Status IS NULL + '%' ,'%',CAST(_Status AS VARCHAR(50),'%');
END

Filter table data using select sql statement

I want to filter table data using select statement, I have four columns, and I have also four text boxes to enable search in each column,and I can enter value in any box(es), when I enter value in text box(es) I want to return the record(s) that match the value(s) I have entered, how can I do that?
ALTER PROCEDURE dbo.test_search
(
#ID int,
#FirstName nvarchar(50),
#MiddleName nvarchar(50),
#LastName nvarchar(50)
)
AS
SELECT ID, FirstName, MiddleName, LastName
FROM StudentsInformation
WHERE (#ID IS NULL OR StudentsInformation.ID = #ID) AND
(#FirstName IS NULL OR StudentsInformation.FirstName = #FirstName )AND
(#MiddleName IS NULL OR StudentsInformation.MiddleName = #MiddleName )AND
(#LastName IS NULL OR StudentsInformation.LastName = #LastName )
RETURN
EDIT:
SELECT
id
, firstname
, middlename
, lastname
FROM studentsinformation
WHERE id = #id
OR firstname LIKE '%' + #firstname + '%'
OR middlename LIKE '%' + #middlename + '%'
OR lastname LIKE '%' + #lastname + '%'
You can swap OR for AND if you want to select records that are true for all the checkboxes.
Syntax Depends upon programming language which you use.
But generally:
string sql="select * from tableName where"
if((txt1.Text!="")&&(sql=="select * from tableName where")
sql=sql+"colName like % #txt1 %"
else
sql=sql+" and colName like % #txt1 %"
if((txt2.Text!="")&&(sql=="select * from tableName where")
sql=sql+"colName like % #txt2 %"
else
sql=sql+" and colName like % #txt2 %"
if((txt3.Text!="")&&(sql=="select * from tableName where")
sql=sql+"colName like % #txt3 %"
else
sql=sql+" and colName like % #txt3 %"
Do like this.
I hope this will work:
Select * from <table-name>
where
<Column-name1> Like 'TextBox1%'
or
<Column-name2> Like 'TextBox2%'
or
<Column-name3> Like 'TextBox2%'
or
<Column-name4> Like 'TextBox4%'
Firstly you need to find text-box in which search string is passed.
Depending on text-box the query could be written on the related the column.
select * from table_name where column like '%text-box value%'
Edit
SELECT ID,FirstName,MiddleName,LastName
FROM StudentsInformation
WHERE 1=1
ID=(case when #ID <>0 AND #ID IS NOT NULL then #ID else ID end)
and FirstName=(case when #FirstName<>'' and #FirstName IS NULL then #FirstName
else FirstName)
and MiddleName=(case when #MiddleName<>'' and #MiddleName IS NULL then #MiddleName
else MiddleName)
and LastName=(case when #LastName<>'' and #LastName IS NULL then #LastName
else LastName)

Simple SQL Query Help

I am building a query for a search in MS SQL 05
i have 4 things the user can select, and i want to use AND logic on it.
but i can't seem to get it to work when NULLs are being passed in.
this is what i have:
ALTER PROCEDURE [dbo].[sp_FindSource]
-- Add the parameters for the stored procedure here
#Code varchar(500),
#ssid varchar(50),
#serialNo varchar(50),
#category decimal(10,5)
as begin
SELECT *
FROM tblSource
WHERE Code IN (
SELECT Value
FROM funcListToTableInt(#Code,',')
)
and SSID LIKE '%' + #ssID + '%'
and serialNo LIKE '%' + #serialNo + '%'
and category = #category
end
NOTE: funcListToTableInt function, parses comma seporated values passed in (it works by itself, if i take the other where statements out)
The above search never returns anything, how can i ignore values if they are passed in black and only query the ones that have something in them? uuggh, it's been killing me.
You just have to wrap some OR #param IS NULL checks around your WHERE conditions:
ALTER PROCEDURE [dbo].[sp_FindSource]
-- Add the parameters for the stored procedure here
#Code varchar(500),
#ssid varchar(50),
#serialNo varchar(50),
#category decimal(10,5)
as begin
SELECT *
FROM tblSource
WHERE (Code IN (SELECT Value FROM funcListToTableInt(#Code,',')) OR #Code IS NULL)
AND (SiteSourceID LIKE '%' + #ssID + '%' OR #ssID IS NULL)
AND (serialNo LIKE '%' + #serialNo + '%' OR #serialNo IS NULL)
AND (category = #category OR #category IS NULL)
end
This looks very strange at first glance, since it is checking the parameters for IS NULL, but it works.
Try adding OR clauses for the nulls. SO for example change 'and category = #category' to 'and ((category = #category) or (category is null)).
Do this for all the items for whiuch you want to have a null imput essectially disable that particular test.
There are two ways:
Way 1, ADD OR Clause: It can kill the performance ....
SELECT *
FROM tblSource
WHERE (Code IN (
SELECT Value
FROM funcListToTableInt(#Code,',')
) OR #Code IS NULL)
and (SiteSourceID LIKE '%' + #ssID + '%' OR #SSID IS NULL)
and (serialNo LIKE '%' + #serialNo + '%' OR #serialNo IS NULL)
and (category = #category OR #category)
Way 2: Conditional logic
Considering you have 4 parameters and each may have a value or may not have a value, So you have 2*2*2*2 , 16 different cases. You can write something like:
IF (#SSID IS NULL AND #Code IS NULL AND #serialNo IS NULL AND #category IS NOT NULL) THEN
-- SEARCH only of category
ELSE IF (#SSID IS NULL AND #Code IS NULL AND #serialNo IS NOT NULL AND #category IS NULL) THEN
-- SEARCH only on Serial Number
.
.
.
.
.
As in SQL Server each If block cache its own plan, it will be more performing but based on parameter and there possible combinations this approach may or may not be desired ...