我有一个SQL Server存储过程,我想在其中将一个varchar
完整的逗号分隔值传递给一个IN
函数。例如:
DECLARE @Ids varchar(50);
SET @Ids = '1,2,3,5,4,6,7,98,234';
SELECT *
FROM sometable
WHERE tableid IN (@Ids);
当然这是行不通的。我得到了错误:
将varchar值‘1,2,3,5,4,6,7,98,234’转换为数据类型int时转换失败。
如何在不借助动态SQL的情况下完成此任务(或相对类似的任务)?
不要使用循环拆分字符串的函数! ,我下面的函数将非常快速地拆分字符串,而且不会循环!
在使用我的函数之前,您需要设置一个“帮助器”表,每个数据库只需要执行一次此操作:
CREATE TABLE Numbers
(Number int NOT NULL,
CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
DECLARE @x int
SET @x=0
WHILE @x<8000
BEGIN
SET @x=@x+1
INSERT INTO Numbers VALUES (@x)
END
使用此函数来拆分您的字符串,该字符串不会循环并且非常快:
CREATE FUNCTION [dbo].[FN_ListToTable]
(
@SplitOn char(1) --REQUIRED, the character to split the @List string on
,@List varchar(8000) --REQUIRED, the list to split apart
)
RETURNS
@ParsedList table
(
ListValue varchar(500)
)
AS
BEGIN
/**
Takes the given @List string and splits it apart based on the given @SplitOn character.
A table is returned, one row per split item, with a column name "ListValue".
This function workes for fixed or variable lenght items.
Empty and null items will not be included in the results set.
Returns a table, one row per item in the list, with a column name "ListValue"
EXAMPLE:
----------
SELECT * FROM dbo.FN_ListToTable(',','1,12,123,1234,54321,6,A,*,|||,,,,B')
returns:
ListValue
-----------
1
12
123
1234
54321
6
A
*
|||
B
(10 row(s) affected)
**/
----------------
--SINGLE QUERY-- --this will not return empty rows
----------------
INSERT INTO @ParsedList
(ListValue)
SELECT
ListValue
FROM (SELECT
LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
FROM (
SELECT @SplitOn + @List + @SplitOn AS List2
) AS dt
INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
WHERE SUBSTRING(List2, number, 1) = @SplitOn
) dt2
WHERE ListValue IS NOT NULL AND ListValue!=''
RETURN
END --Function FN_ListToTable
您可以将此函数用作联接中的表:
SELECT
Col1, COl2, Col3...
FROM YourTable
INNER JOIN FN_ListToTable(',',@YourString) s ON YourTable.ID = s.ListValue
这是您的示例:
Select * from sometable where tableid in(SELECT ListValue FROM dbo.FN_ListToTable(',',@Ids) s)
我正在使用aws cli创建EMR集群并添加一个步骤。创建集群命令如下所示:
问题内容: 我有一个这样的表: Department是另一个具有dept_id和dept_name作为列的表。我想要这样的结果, 有什么帮助吗? 问题答案: 您可以按照以下方式进行操作: 编辑: 基于我需要加入哪一列?在一个表中,我有逗号分隔的ID,而在其他表中,我只有ID
问题内容: 我返回的值包含255个逗号分隔的值。有没有一种简单的方法可以将其拆分为不具有255 substr的列? 到 问题答案: 您可以使用: 我建议您在Excel(或其他电子表格)中生成255个数字的列,并使用电子表格生成SQL代码。
问题内容: 我正在编写导出功能,我需要将联系人导出到Excel,并且遇到了技术难题-也许我的SQL技能的差距更接近事实了。;) 这是场景:我在数据库中有一堆联系人。每个联系人可以具有许多不同的角色,例如,一个联系人可以是C#开发人员和DBA,也可以是DBA和IT经理。它们分为三个表,如下所示: 不太难遵循。有一组联系人和一组角色。这些由相应ID上的ContactRole表连接。 导出联系人时,我需
问题内容: 我的数据库中有列,其中的值如下所示: 在虚拟列中没有任何编号。逗号分隔的值可以出现。我尝试了以下查询,但它正在创建重复的结果。 我不明白这个问题。谁能帮忙? 问题答案: 非常适合我- 还有许多其他方法可以实现它。阅读将单个逗号分隔的字符串拆分成行。 *关于使用列而不是单个字符串值时的重复项的 *更新 。只见PRIOR子句中使用DBMS_RANDOM的摆脱循环回路的在这里 尝试以下方法
我如何修改我的regex来为那些以“”或“,”开头,以“”或“,”结尾的字符串返回false