SQL Server 2008 R2:查找比给定数字长的单元格
Posted
技术标签:
【中文标题】SQL Server 2008 R2:查找比给定数字长的单元格【英文标题】:SQL Server 2008 R2: Finding cells longer than given number 【发布时间】:2018-05-30 03:37:07 【问题描述】:我有一些记录的下表。
表格:
CREATE TABLE TblPatterns
(
ColPattern VARCHAR(20)
);
INSERT INTO TblPatterns VALUES('123A4567890'),
('123B4567890'),
('123A4567891'),
('123A4567892'),
('243C4567890'),
('123A4567890'),
('123'),
('243'),
('123'),
('24'),
('1');
我需要编写查询以完全匹配给定的模式。
给定的模式就像 1 到 10 或 11。我需要做的是,必须检查准确 LEFT 中的字符匹配。
示例 1:
DECLARE @Pat int = 10
预期输出:
ColPattern
---------------
123A4567890
123A4567891
123A4567892
示例 2:
DECLARE @Pat int = 3
预期输出:
ColPattern
---------------
123A4567890
123B4567890
123A4567891
123A4567892
123
243C4567890
243
示例 3:
DECLARE @Pat int = 1
预期输出:
ColPattern
---------------
123A4567890
123B4567890
123A4567891
123A4567892
243C4567890
123
243
24
1
我的尝试:1
DECLARE @Pat int = 10
SELECT DISTINCT ColPattern
FROM TblPatterns
WHERE substring(ColPattern,1,@Pat) IN
(
SELECT substring(ColPattern,1,@Pat)
FROM TblPatterns
GROUP BY substring(ColPattern,1,@Pat)
HAVING COUNT(*) > 1
);
但是得到了意想不到的结果:
ColPattern
------------
123
123A4567890
123A4567891
123A4567892
【问题讨论】:
我无法从示例中理解。 pat = 1 如何匹配 243、24。 pat = 10 如何匹配 123A4567892 @VenkataramanR,正如我所说,它应该从 LEFT 开始匹配,在 pat =1 中找到243
和 24
的匹配项,因为 2
是左起第一个。
pat =1, LEFT 如何匹配所有这些模式。 123A4567890 123B4567890 123A4567891 123A4567892 243C4567890 123 243 24 1
@VenkataramanR,因为HAVING COUNT(*) > 1
。
如果你只删除123
之一,问题就解决了。
【参考方案1】:
您必须使用以下逻辑来获取匹配特定长度的模式。
DECLARE @pat INT = 1
SELECT * from TblPatterns WHERE LEN(colPattern) >= @pat;
我也放了SQLFiddle reference
【讨论】:
以上是关于SQL Server 2008 R2:查找比给定数字长的单元格的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 2008 R2 中为特定数据库用户设置最大查询数
SQL Server 2008 R2:查找 column2 值存在于 column1 中的行
SQL Server 2008 R2:查找两列之间的链接和链接