这样的SQL 怎么写

jldzy 2015-08-05 01:23:05
现在有一个字符串 字段 中间是用, 隔开,例如 '123,456,789,900,800'
tbl(Strs)

传入一个参数(123,456) 要判断 该表是否 存在 除了 123 或 456 或 123,456 以外的字符,当然传入参数可能是1 个, 或者多个,例如123,456,700,800

1 首先找到包含 参数里面的值记录
where Strs like '%123%' or Strs like '%456%'

2 判断该记录 里面是否还存在 除 123,456 以外字符。 这个怎么写。不想用循环来判断

例如 有下面记录,传入123,456 , 需要返回 4,5,6 三行记录。

1(123)
2(456)
3(123,456)
4(123,700)
5(456,700)
6(123,456,800)
7(900,99)
...全文
131 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Haytor 2015-08-05
  • 打赏
  • 举报
回复
可以参考一下这个脚本

DECLARE @str NVARCHAR(MAX)
DECLARE @xml XML
SET @str = '123,456'
SET @xml = '<root><row>'+REPLACE(@str,',','</row><row>')+'</row></root>'

;WITH tbl(Strs)AS (
	SELECT '123' UNION ALL
	SELECT '456' UNION ALL
	SELECT '123,456' UNION ALL
	SELECT '123,700' UNION ALL
	SELECT '456,700' UNION ALL
	SELECT '123,456,800' UNION ALL
	SELECT '900,99'
),
tb2 AS (
	SELECT
		T.c.value('.','nvarchar(max)') AS nValue
	FROM @xml.nodes('/root/row') T(c)
)
SELECT DISTINCT
	a.Strs
FROM 
	tbl a INNER JOIN tb2 b 
ON 
	CHARINDEX(b.nValue+',',a.Strs+',')>0 AND 
	REPLACE(a.Strs,b.nValue,'')<>'' AND 
	REPLACE(a.Strs,@str,'')<>''

Tiger_Zhao 2015-08-05
  • 打赏
  • 举报
回复
WITH
/* 测试数据
table1(id,Strs) AS (
SELECT 1,'123' UNION ALL
SELECT 2,'456' UNION ALL
SELECT 3,'123,456' UNION ALL
SELECT 4,'123,700' UNION ALL
SELECT 5,'456,700' UNION ALL
SELECT 6,'123,456,800' UNION ALL
SELECT 7,'900,99'
), */
a AS (
SELECT id,
','+Strs+',' Strs
FROM table1
)
,b AS (
SELECT id,
REPLACE(REPLACE(Strs,
',123,',
','),
',456,',
',') Strs
FROM a
WHERE Strs LIKE '%,123,%' OR
Strs LIKE '%,456,%'
)
SELECT id
FROM b
WHERE LEN(REPLACE(Strs,',',''))<>0

         id
-----------
4
5
6

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧