我有一个存储RDF三元组的表:
三元组(triple_id,sub_id,pre_id,obj_id)
方法(我需要编写)将接收一个与pre_id值对应的数字数组。我想为传入的数组中的所有pre_id选择具有相应pre_id的所有sub_id值。
E.g。如果我传入了一个pre_id值...让我们调用preId中传递的值,我会这样做:
从triples中选择sub_id,其中pre_id = preId;
然而,由于我有多个pre_id值,我想继续遍历pre_id值,并且只保留sub_id值对应于具有两者的“三元组”记录。
E.g。图片有五条记录:
triples(1, 34,65,23)
triples(2, 31,35,28)
triples(3, 32,32,19)
triples(4, 12,65,28)
triples(5, 76,32,34)
如果我传入一组pre_id值[65,32],那么我想选择第一,第三,第四和第五条记录。
我该怎么做?
答案 0 :(得分:5)
这可能不适用于每个数据库,但关键字in
可以执行此操作:
select sub_id from triples where pre_id in (65, 32)
答案 1 :(得分:3)
您将传入的数据作为单个字符串接收,按分隔符拆分,然后将其放入@Table并使用JOIN
,EXISTS
或sub query
来获取返回你想要的行。
以下是将字符串拆分为@Table
的方法T-SQL: Opposite to string concatenation - how to split string into multiple records
SQL 2008中的完全工作示例
DROP FUNCTION dbo.Split
go
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(8000))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
FROM Pieces
)
GO
Declare @Triples Table
(
triple_id Int,
sub_id VarChar (10),
pre_id VarChar (10),
obj_id VarChar (10)
)
INSERT INTO @Triples VALUES
(1, 34,65,23),
(2, 31,35,28),
(3, 32,32,19),
(4, 12,65,28),
(5, 76,32,34)
SELECT *
FROM @Triples Triples
INNER JOIN dbo.split (',', '65,32') as InputValues
ON Triples.pre_id = InputValues.S
答案 2 :(得分:1)
您可以像这样使用子查询。
从triple中选择sub_id,其中pre_id为IN(从trile中选择pre_id,其中pre_id< = 65 AND pre_id => 32)
答案 3 :(得分:1)
你能做到的一种方法是使用表值函数 存在于MYSQL中(抱歉,但我不为其他人所知)
CREATE FUNCTION [dbo].[fn_ado_test] (@ado nvarchar(4000), @Delim char(1)= ',')
RETURNS @VALUES TABLE (ado nvarchar(4000),id int)AS
BEGIN
DECLARE @chrind INT
DECLARE @id int
DECLARE @Piece nvarchar(4000)
SELECT @chrind = 1,@id=0
WHILE @chrind > 0
BEGIN
SELECT @chrind = CHARINDEX(@Delim,@ado),@id=@id+1
IF @chrind > 0
SELECT @Piece = LEFT(@ado,@chrind - 1)
ELSE
SELECT @Piece = @ado
INSERT @VALUES(ado,id) VALUES(@Piece,@id)
SELECT @ado = RIGHT(@ado,LEN(@ado) - @chrind)
IF LEN(@ado) = 0 BREAK
END
RETURN
END
之后你使用这样的语句
/*--For First argument --*/
select ado from [dbo].[fn_ado_test]('1,2,3',',') as parametar
where parametar.id=1
/*-- Second --*/
select ado from [dbo].[fn_ado_test]('1,2,3',',') as parametar
where parametar.id=2
答案 4 :(得分:0)
SELECT sub_id FROM triples WHERE pre_id IN (65, 32)
似乎对我有用。
注意:使用MySQL。