如何在sql developer中将varchar转换为数字
我试图使用这样的数字列表如何在sql developer中将varchar转换为数字,sql,plsql,oracle-sqldeveloper,Sql,Plsql,Oracle Sqldeveloper,我试图使用这样的数字列表 SELECT * FROM users WHERE id in (list_of_ids) 这是sql过程的一部分,变量'list_of_id'是varchar,它包含如下id:1,2,3,4,5。。。。。。。。 如何使用此列表和此查询请尝试此操作。这可能是更好的解决方案,因为它不需要任何额外的函数来创建。 oracle regexp_substr将逗号分隔的值拆分为不同的行,并传递给查询 SELECT * FROM users WHERE id in (SELEC
SELECT *
FROM users
WHERE id in (list_of_ids)
这是sql过程的一部分,变量'list_of_id'是varchar,它包含如下id:1,2,3,4,5。。。。。。。。
如何使用此列表和此查询请尝试此操作。这可能是更好的解决方案,因为它不需要任何额外的函数来创建。 oracle regexp_substr将逗号分隔的值拆分为不同的行,并传递给查询
SELECT *
FROM users
WHERE id in
(SELECT regexp_substr(list_of_ids,'[^,]+', 1, level) FROM dual
connect by regexp_substr(list_of_ids, '[^,]+', 1, level) is not NULL)
也试试这个。这可能是更好的解决方案,因为它不需要任何额外的函数来创建。 oracle regexp_substr将逗号分隔的值拆分为不同的行,并传递给查询
SELECT *
FROM users
WHERE id in
(SELECT regexp_substr(list_of_ids,'[^,]+', 1, level) FROM dual
connect by regexp_substr(list_of_ids, '[^,]+', 1, level) is not NULL)
您可以使用ref游标构造sql查询,如下pl/sql块所示:
declare
list_of_ids varchar2(100) := '1,3,4'; -- example
c_cursor sys_refcursor;
result number;
begin
open c_cursor for ( 'SELECT id '||
'FROM users '||
'WHERE id in ('||list_of_ids||')'
);
fetch c_cursor into result;
while c_cursor%found
loop
dbms_output.put_line('ID='||to_char(result));
fetch c_cursor into result;
end loop;
close c_cursor;
end;
/
您可以使用ref游标构造sql查询,如下pl/sql块所示:
declare
list_of_ids varchar2(100) := '1,3,4'; -- example
c_cursor sys_refcursor;
result number;
begin
open c_cursor for ( 'SELECT id '||
'FROM users '||
'WHERE id in ('||list_of_ids||')'
);
fetch c_cursor into result;
while c_cursor%found
loop
dbms_output.put_line('ID='||to_char(result));
fetch c_cursor into result;
end loop;
close c_cursor;
end;
/
在您的项目中尝试此解决方案。
添加一个返回表的新用户函数。
代码如下:
CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter
varchar(20) = ' ')
RETURNS @Strings TABLE
(
position int IDENTITY PRIMARY KEY,
value varchar(8000)
)
AS
BEGIN
DECLARE @index int
SET @index = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
然后从存储过程调用它,如下所示
DECLARE @list_of_ids AS VARCHAR(100)
SET @list_of_ids = '1,2,3,4,5,6,7,8,9,10,'
SELECT *
FROM users
WHERE id in (SELECT value FROM dbo.fn_Split(@list_of_ids,','))
在您的项目中尝试此解决方案。
添加一个返回表的新用户函数。
代码如下:
CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter
varchar(20) = ' ')
RETURNS @Strings TABLE
(
position int IDENTITY PRIMARY KEY,
value varchar(8000)
)
AS
BEGIN
DECLARE @index int
SET @index = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
然后从存储过程调用它,如下所示
DECLARE @list_of_ids AS VARCHAR(100)
SET @list_of_ids = '1,2,3,4,5,6,7,8,9,10,'
SELECT *
FROM users
WHERE id in (SELECT value FROM dbo.fn_Split(@list_of_ids,','))
看起来像SQL Server表值函数。下面是我在oracle上找到的一个示例。然而@NoRules的回答看起来更优雅。让我希望我们在微软方面有regexp_substr。看起来像SQL Server表值函数。下面是我在oracle上找到的一个示例。然而@NoRules的回答看起来更优雅。让我希望我们在微软方面有regexp_substr。