根据某些字母组合筛选SQL行



我有一个从前端网站存储用户输入文本字段的列。用户可以在其中输入任何类型的文本,但他们也可以输入特定的字母组合来代表工作类型-例如'dri'。例如:

Row 1: P49384; Open vehicle bonnet-BO-dri 22/10
Row 2: P93818; Vehicle exhaust-BO 10/20
Row 3: P1933; battery dri-pu-103/2
Row 4: P3193; screwdriver-pu 423
Row 5: X939; seats bo
Row 6: P9381-vehicle-pu-bo dri

在本例中,我希望只过滤包含dri的行。从这个例子中,您可以看到文本可以是任何顺序(用户行为,他们可以键入他们喜欢的任何内容,而不遵循任何格式)。但常量是,对于特定的作业类型,他们将输入dri

我知道我可以简单地使用LIKE在SQL Server得到这些行。不幸的是,当我使用这个操作符时,第4行包含在里面。这是因为螺丝刀含有dri

是否有任何方法在SQL Server我可以做严格地只获得行dri作业类型,而不包括字螺丝刀?

我试图使用PATINDEX,但它失败了-PATINDEX('%[d][r][i]%', column) > 0

提前感谢。

您的数据是这里的问题。不幸的是,即使对于非规范化的数据,它似乎也没有可靠的/定义的格式,这使得用T-SQL这样的语言解析数据几乎是不可能的。有什么问题?根据原始样本数据,一眼望去存在以下问题:

  • 第一个数据值的分隔符不一致。第1-5行使用分号(;),但第6行使用连字符(-)
  • 最后一个数据值的分隔符不一致。第1、2行& &;第4行使用空格(),但第3行使用连字符(-)。
  • 内部数据不使用一致的分隔符。例如:
    • 第1行有一个值Open vehicle bonnet-BO-dri,它看起来是Open vehicle bonnet,BOdri;所以连字符(-)是分隔符。
    • 第5行有seats bo,它似乎是值seatsbo,因此使用空格()作为分隔符。
    • 然而,第6行有vehicle作为自己的值(vehicle-pu-bo-dri),这意味着Open vehicle bonnetVehicle Exhaust(分别在第1行和第2行上)可以实际上是Open,vehicle, &bonnetVehicle&分别Exhaust

老实说,解决方案是修复您的设计。因此,您的表应该看起来像这样:

CREATE TABLE dbo.Job (JobID varchar(6) CONSTRAINT PK_JobID PRIMARY KEY NONCLUSTERED, --NONCLUSTERED Because it's not always ascending
YourNumericalLikeValue varchar(5) NULL); --Obviously use a better name
CREATE TABLE dbo.JobTypeCompleted(JobTypeID int IDENTITY (1,1) CONSTRAINT PK_JobTypeID PRIMARY KEY CLUSTERED,
JobID varchar(6) NOT NULL CONSTRAINT FK_JobType_Job FOREIGN KEY REFERENCES dbo.Job (JobID),
JobType varchar(30) NOT NULL); --Must likely this'll actually be a foreign key to an actual job type table
GO

然后,对于您的几行,数据将像这样插入:

INSERT INTO dbo.Job (JobID, YourNumericalLikeValue)
VALUES('P49384','22/10'),
('P9381',NULL);
GO
INSERT INTO dbo.JobTypeCompleted(JobID,JobType)
VALUES('P49384','Open vehicle bonnet'),
('P49384','BO'),
('P49384','dri'),
('P9381','vehicle'),
('P9381','pu'),
('P9381','bo'),
('P9381','dri');

然后您可以轻松地通过一个简单的查询获得您想要的工作:

SELECT J.JobID,
J.YourNumericalLikeValue
FROM dbo.Job J
WHERE EXISTS (SELECT 1
FROM dbo.JobTypeCompleted JTC
WHERE JTC.JobID = J.JobID
AND JTC.JobType = 'dri');

您可以在查询中应用类似的操作符,如'%-dri'。意思是找出以"- drive ">

结尾的记录。

最新更新