复杂的模式检查

时间:2015-08-18 14:37:47

标签: sql-server tsql

DECLARE @T TABLE
(
    BP1 VARCHAR (30),
    BP2 VARCHAR (30),
    BP3 VARCHAR (30)
)

INSERT @T
    SELECT '10x184','10x184','6x70' UNION ALL
    SELECT '303x112','8x40','3x112' UNION ALL
    SELECT '8x100','4x100','8x65'

SELECT * FROM @T

/*
if 8 before x and less than 95 after x need to be in output
if 6 before x and less than 71 after x need to be in output
*/

预期产出:

6x70
8x40
8x65

1 个答案:

答案 0 :(得分:0)

这对你有用:

SELECT BP1 FROM @T
WHERE (CAST(SUBSTRING(BP1, 1, CHARINDEX('x', BP1) - 1) AS SMALLINT) = 6 AND CAST(SUBSTRING(BP1, CHARINDEX('x', BP1) + 1, LEN(BP1) - CHARINDEX('x', BP1)) AS SMALLINT) < 71)
OR
(CAST(SUBSTRING(BP1, 1, CHARINDEX('x', BP1) - 1) AS SMALLINT) = 8 AND CAST(SUBSTRING(BP1, CHARINDEX('x', BP1) + 1, LEN(BP1) - CHARINDEX('x', BP1)) AS SMALLINT) < 95)
UNION
SELECT BP2 FROM @T
WHERE (CAST(SUBSTRING(BP2, 1, CHARINDEX('x', BP2) - 1) AS SMALLINT) = 6 AND CAST(SUBSTRING(BP2, CHARINDEX('x', BP2) + 1, LEN(BP2) - CHARINDEX('x', BP2)) AS SMALLINT) < 71)
OR
(CAST(SUBSTRING(BP2, 1, CHARINDEX('x', BP2) - 1) AS SMALLINT) = 8 AND CAST(SUBSTRING(BP2, CHARINDEX('x', BP2) + 1, LEN(BP2) - CHARINDEX('x', BP2)) AS SMALLINT) < 95)
UNION
SELECT BP3 FROM @T
WHERE (CAST(SUBSTRING(BP3, 1, CHARINDEX('x', BP3) - 1) AS SMALLINT) = 6 AND CAST(SUBSTRING(BP3, CHARINDEX('x', BP3) + 1, LEN(BP3) - CHARINDEX('x', BP3)) AS SMALLINT) < 71)
OR
(CAST(SUBSTRING(BP3, 1, CHARINDEX('x', BP3) - 1) AS SMALLINT) = 8 AND CAST(SUBSTRING(BP3, CHARINDEX('x', BP3) + 1, LEN(BP3) - CHARINDEX('x', BP3)) AS SMALLINT) < 95)