您好
我正在尝试学习SQL查询,但我想要一些帮助。我正在尝试查找一个查询,例如我可以从数据库时间搜索数据行,例如搜索值等于Z370,0631和048X的位置。
您将用于过滤此信息的查询是什么?
答案 0 :(得分:2)
如果要搜索多个列,则需要使用“OR”子句并分别检查每列中的值。 'IN'关键字允许您根据提供的列表检查值:
SELECT *
FROM tablename
WHERE test1 IN ( 'Z370', 'O631', 'O48X' )
OR test2 IN ( 'Z370', 'O631', 'O48X' )
注意:你的表的真实名称应该替换tablename(不带引号)。
答案 1 :(得分:1)
使用本教程:http://www.w3schools.com/sql/sql_syntax.asp来学习sql查询的语法。
基本语法是:
SELECT columns FROM table WHERE column = 'value'
答案 2 :(得分:0)
我认为您首先需要为列定义唯一的名称。你不能有test1 3次。 此外,每行应该(必须)具有任何行的主键才有意义。
但是从DB获取内容的命令将是
SELECT [names of columns] FROM [name of table] WHERE [column name]=value
答案 3 :(得分:0)
以下是一系列步骤,可以启用您所寻求的行为。 它将描述如何执行以下操作:
1:构建一个过程,该过程分割描述的值并返回包含每个值的表。
2:构建一个过程,检查查询中是否有资格返回行。
-2.1:使用步骤1将用户值放入临时表。
-2.2:使用步骤1将行值放入临时表。
-2.3:计算2.2中的行数,其中2.1包含2.2的行值。
-2.4:如果2.3 = 2.1中的值数,则返回true。
3:从表格中选择Step2 = true的值。
这是分割字符串的过程
CREATE function [dbo].[f_split]
(
@param nvarchar(max),
@delimiter char(1)
)
returns @t table (val nvarchar(max), seq int)
as
begin
set @param += @delimiter
;with a as
(
select cast(1 as bigint) f, charindex(@delimiter, @param) t, 1 seq
union all
select t + 1, charindex(@delimiter, @param, t + 1), seq + 1
from a
where charindex(@delimiter, @param, t + 1) > 0
)
insert @t
select substring(@param, f, t - f), seq from a
option (maxrecursion 0)
return
end
这里是一个函数,如果给定的行匹配少于100%,则返回false 请记住,这不是优化的,并且格式化为清楚地展示了一个概念。
CREATE FUNCTION [dbo].[Row_MeetsCriteria_FullText]
(
@RowID Int,
@Criteria Nvarchar(Max)
)
RETURNS Bit
AS
BEGIN
Declare @Result as Bit = 1
Declare @IntResult as int = 0
Declare @test1ColumnValue Nvarchar(4) = (Select Test1 from TestdataTable where TESTID = @RowID)
Declare @test2ColumnValue Nvarchar(4) = (Select Test2 from TestdataTable where TESTID = @RowID)
Declare @test3ColumnValue Nvarchar(4) = (Select Test3 from TestdataTable where TESTID = @RowID)
Declare @result1ColumnValue Nvarchar(4) = (Select Result1 from TestdataTable where TESTID = @RowID)
Declare @result2ColumnValue Nvarchar(4) = (Select Result2 from TestdataTable where TESTID = @RowID)
Declare @result3ColumnValue Nvarchar(4) = (Select Result3 from TestdataTable where TESTID = @RowID)
if @Result = 1 --Continue checking
Begin
If LEN(@Criteria) > 0
begin
Declare @allStrings Nvarchar(Max)
set @allStrings = (@test1ColumnValue + N' ' + @test2ColumnValue + N' ' +@test3ColumnValue + N' ' +@result1ColumnValue + N' ' +@result2ColumnValue + N' ' +@result3ColumnValue)
declare @CriteriaTable Table (Criteria Nvarchar(MAX),seq int)
insert into @CriteriaTable Select * from dbo.f_split(@Criteria,' ')
declare @Matches int = (select Count(Criteria) from @CriteriaTable Where @allStrings Like(Criteria))
Declare @NumberOfCriteria int = (select COUNT(Criteria) from @CriteriaTable)
Set @IntResult = ((100 / @NumberOfCriteria) * @Matches)
if @IntResult < 100
begin
Set @Result = 0
end
end
end
RETURN @result
END
现在只需根据函数查询您的表 客户进入这个值&#34; 1z27 2345 tthy you8&#34;
你的程序
从testdata中选择* dbo.rowmeetscriteria(RowID,&#34; 1z27 2345 tthy you8&#34;)
为了优化这一点,可以通过将行值直接传递给过程来避免双重查询。