帮CSDN朋友发贴

吉普赛的歌 2019-11-16 08:34:51
...全文
77 点赞 收藏 9
写回复
9 条回复
万花盛处松千尺 2019年11月16日
引用 5 楼 吉普赛的歌 的回复:
[quote=引用 4 楼 万花盛处松千尺 的回复:] [quote=引用 3 楼 二月十六 的回复:]
CREATE FUNCTION dbo.f_test
    (
      @s VARCHAR(8000) ,    
      @col VARCHAR(200)     
    )
RETURNS INT 
AS
    BEGIN  
	    DECLARE @re INT=0
		DECLARE @i INT = 1 
        WHILE LEN(@s) > 0
            BEGIN  
                IF @col LIKE '%'+LEFT(@s, 1 )+'%'
				BEGIN
				SET @re =  1;
				BREAK;                
				END
                ELSE
                BEGIN
				SET @s = STUFF(@s, 1,1, '')  
				SET @i = @i +1								
				END
                
            END   
			RETURN @re
    END  
GO

IF OBJECT_ID('Table_3') IS NOT NULL
    DROP TABLE Table_3
GO
CREATE TABLE [dbo].[Table_3](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Range] [nvarchar](20) NULL,
[Name] [nvarchar](20) NULL
) ON [PRIMARY]
GO
SET NOCOUNT ON;
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('12345','AAA')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('23','BBB')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('34','CCC')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('13','DDD')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('23','EEE')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('25','FFF')
------- 以上为测试表及测试数据 ----------

SELECT * FROM dbo.Table_3 AS t 
WHERE dbo.f_test('14',Range)=1
对,是我想要的结果,谢谢版主!!!真是厉害呀!我都以为SQL实现不了呢,已经想在代码里实现了。 谢谢版主!真是大神级别啊![/quote] 还是有点问题, 到底是想找 1 或 4 , 还是想找 14 ? 你的输入参数应该是 '1,4,14' 这种才是合理的。[/quote] 哦。。。是我没有表达清楚,‘14’这样的条件,意思是,只要包含有1或者4的都要,按每个字符来进行查询的。 谢谢版主的帮助!!!
回复 点赞
吉普赛的歌 2019年11月16日
引用 4 楼 万花盛处松千尺 的回复:
[quote=引用 3 楼 二月十六 的回复:]
CREATE FUNCTION dbo.f_test
    (
      @s VARCHAR(8000) ,    
      @col VARCHAR(200)     
    )
RETURNS INT 
AS
    BEGIN  
	    DECLARE @re INT=0
		DECLARE @i INT = 1 
        WHILE LEN(@s) > 0
            BEGIN  
                IF @col LIKE '%'+LEFT(@s, 1 )+'%'
				BEGIN
				SET @re =  1;
				BREAK;                
				END
                ELSE
                BEGIN
				SET @s = STUFF(@s, 1,1, '')  
				SET @i = @i +1								
				END
                
            END   
			RETURN @re
    END  
GO

IF OBJECT_ID('Table_3') IS NOT NULL
    DROP TABLE Table_3
GO
CREATE TABLE [dbo].[Table_3](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Range] [nvarchar](20) NULL,
[Name] [nvarchar](20) NULL
) ON [PRIMARY]
GO
SET NOCOUNT ON;
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('12345','AAA')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('23','BBB')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('34','CCC')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('13','DDD')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('23','EEE')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('25','FFF')
------- 以上为测试表及测试数据 ----------

SELECT * FROM dbo.Table_3 AS t 
WHERE dbo.f_test('14',Range)=1
对,是我想要的结果,谢谢版主!!!真是厉害呀!我都以为SQL实现不了呢,已经想在代码里实现了。 谢谢版主!真是大神级别啊![/quote] 还是有点问题, 到底是想找 1 或 4 , 还是想找 14 ? 你的输入参数应该是 '1,4,14' 这种才是合理的。
回复 点赞
万花盛处松千尺 2019年11月16日
引用 3 楼 二月十六 的回复:
CREATE FUNCTION dbo.f_test
    (
      @s VARCHAR(8000) ,    
      @col VARCHAR(200)     
    )
RETURNS INT 
AS
    BEGIN  
	    DECLARE @re INT=0
		DECLARE @i INT = 1 
        WHILE LEN(@s) > 0
            BEGIN  
                IF @col LIKE '%'+LEFT(@s, 1 )+'%'
				BEGIN
				SET @re =  1;
				BREAK;                
				END
                ELSE
                BEGIN
				SET @s = STUFF(@s, 1,1, '')  
				SET @i = @i +1								
				END
                
            END   
			RETURN @re
    END  
GO

IF OBJECT_ID('Table_3') IS NOT NULL
    DROP TABLE Table_3
GO
CREATE TABLE [dbo].[Table_3](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Range] [nvarchar](20) NULL,
[Name] [nvarchar](20) NULL
) ON [PRIMARY]
GO
SET NOCOUNT ON;
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('12345','AAA')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('23','BBB')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('34','CCC')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('13','DDD')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('23','EEE')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('25','FFF')
------- 以上为测试表及测试数据 ----------

SELECT * FROM dbo.Table_3 AS t 
WHERE dbo.f_test('14',Range)=1
对,是我想要的结果,谢谢版主!!!真是厉害呀!我都以为SQL实现不了呢,已经想在代码里实现了。 谢谢版主!真是大神级别啊!
回复 点赞
二月十六 2019年11月16日
CREATE FUNCTION dbo.f_test
    (
      @s VARCHAR(8000) ,    
      @col VARCHAR(200)     
    )
RETURNS INT 
AS
    BEGIN  
	    DECLARE @re INT=0
		DECLARE @i INT = 1 
        WHILE LEN(@s) > 0
            BEGIN  
                IF @col LIKE '%'+LEFT(@s, 1 )+'%'
				BEGIN
				SET @re =  1;
				BREAK;                
				END
                ELSE
                BEGIN
				SET @s = STUFF(@s, 1,1, '')  
				SET @i = @i +1								
				END
                
            END   
			RETURN @re
    END  
GO

IF OBJECT_ID('Table_3') IS NOT NULL
    DROP TABLE Table_3
GO
CREATE TABLE [dbo].[Table_3](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Range] [nvarchar](20) NULL,
[Name] [nvarchar](20) NULL
) ON [PRIMARY]
GO
SET NOCOUNT ON;
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('12345','AAA')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('23','BBB')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('34','CCC')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('13','DDD')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('23','EEE')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('25','FFF')
------- 以上为测试表及测试数据 ----------

SELECT * FROM dbo.Table_3 AS t 
WHERE dbo.f_test('14',Range)=1
回复 点赞
吉普赛的歌 2019年11月16日
引用 8 楼 万花盛处松千尺 的回复:
你的输入只是单个字符,没有多位的话就非常简单了, 不需要函数都可以的:

--输入参数变量
DECLARE @s NVARCHAR(500)
SET @s='14'
--查询
;WITH cte AS (
SELECT SUBSTRING(@s,sv.number,1) AS singleChar
FROM MASTER.dbo.spt_values AS sv
WHERE sv.type='P' AND sv.number>0 AND sv.number<=LEN(@s)
)
SELECT * FROM dbo.Table_3 AS a
WHERE EXISTS(
SELECT 1 FROM cte AS b WHERE a.Range LIKE '%'+b.singleChar+'%'
)
/*
ID Range Name
----------- -------------------- --------------------
1 12345 AAA
3 34 CCC
4 13 DDD
*/


刚刚测试了,结果正确,是我需要的。
版主真都是大神级别啊![/quote]

---------------------------------------------

结贴了, 欢迎常来论坛!
不过, 下次还是自己发贴吧, 点击左上角的发贴按钮就可以了。


---------------------------------------------
回复 点赞
万花盛处松千尺 2019年11月16日
你的输入只是单个字符,没有多位的话就非常简单了, 不需要函数都可以的:
--输入参数变量
DECLARE @s NVARCHAR(500)
SET @s='14'
--查询
;WITH cte AS (
	SELECT SUBSTRING(@s,sv.number,1) AS singleChar 
	FROM MASTER.dbo.spt_values AS sv 
	WHERE sv.type='P' AND sv.number>0 AND sv.number<=LEN(@s)
)
SELECT * FROM dbo.Table_3 AS a 
WHERE EXISTS(
	SELECT 1 FROM cte AS b	WHERE a.Range LIKE '%'+b.singleChar+'%'
) 
/*
ID          Range                Name
----------- -------------------- --------------------
1           12345                AAA
3           34                   CCC
4           13                   DDD
*/
[/quote] 刚刚测试了,结果正确,是我需要的。 版主真都是大神级别啊!
回复 点赞
万花盛处松千尺 2019年11月16日
我就是提上面问题的人,在这里感谢大版的帮助! 查询条件“14”只是一个举例,查询条件有可能是1、2、3、或12、23、13或者123、234、345,类似的任意组合,并不是固定的。当前,如果有必要的话,字段里的内容“12345”我可以在中间加上分隔符。 业务是这样的,该表记录结算方信息,但是在使用场景中,要求不是所有的结算都载入,不同场景中载入需要的结算方,用这个字段进行区分。 不知道这种需求大家还有没有更好的设计,先谢谢大家!!!
回复 点赞
吉普赛的歌 2019年11月16日
USE tempdb
GO
IF OBJECT_ID('Table_3') IS NOT NULL
	DROP TABLE Table_3
GO
CREATE TABLE [dbo].[Table_3](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Range] [nvarchar](20) NULL,
[Name] [nvarchar](20) NULL
) ON [PRIMARY]
GO
SET NOCOUNT ON;
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('12345','AAA')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('23','BBB')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('34','CCC')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('13','DDD')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('23','EEE')
INSERT INTO [dbo].[Table_3]([Range],[Name])VALUES('25','FFF')
------- 以上为测试表及测试数据 ----------

SELECT * FROM dbo.Table_3 AS t 
WHERE [Range] LIKE '%1%' OR [Range] LIKE '%4%'
/*
ID          Range                Name
----------- -------------------- --------------------
1           12345                AAA
3           34                   CCC
4           13                   DDD
*/


回复 点赞
吉普赛的歌 2019年11月16日
引用 6 楼 万花盛处松千尺 的回复:
哦。。。是我没有表达清楚,‘14’这样的条件,意思是,只要包含有1或者4的都要,按每个字符来进行查询的。 谢谢版主的帮助!!!
你的输入只是单个字符,没有多位的话就非常简单了, 不需要函数都可以的:
--输入参数变量
DECLARE @s NVARCHAR(500)
SET @s='14'
--查询
;WITH cte AS (
	SELECT SUBSTRING(@s,sv.number,1) AS singleChar 
	FROM MASTER.dbo.spt_values AS sv 
	WHERE sv.type='P' AND sv.number>0 AND sv.number<=LEN(@s)
)
SELECT * FROM dbo.Table_3 AS a 
WHERE EXISTS(
	SELECT 1 FROM cte AS b	WHERE a.Range LIKE '%'+b.singleChar+'%'
) 
/*
ID          Range                Name
----------- -------------------- --------------------
1           12345                AAA
3           34                   CCC
4           13                   DDD
*/
回复 点赞
发动态
发帖子
疑难问题
创建于2007-09-28

9310

社区成员

12.1w+

社区内容

MS-SQL Server 疑难问题
社区公告
暂无公告