当前位置: 代码迷 >> Sql Server >> 这样的SQL 如何写
  详细解决方案

这样的SQL 如何写

热度:415   发布时间:2016-04-24 08:50:27.0
这样的SQL 怎么写
现在有一个字符串 字段 中间是用, 隔开,例如 '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)
------解决思路----------------------
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

------解决思路----------------------
可以参考一下这个脚本

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,'')<>''

  相关解决方案