我有一个从前端网站存储用户输入文本字段的列。用户可以在其中输入任何类型的文本,但他们也可以输入特定的字母组合来代表工作类型-例如'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
,BO
和dri
;所以连字符(-
)是分隔符。 - 第5行有
seats bo
,它似乎是值seats
和bo
,因此使用空格()作为分隔符。
- 然而,第6行有
vehicle
作为自己的值(vehicle-pu-bo-dri
),这意味着Open vehicle bonnet
和Vehicle Exhaust
(分别在第1行和第2行上)可以实际上是Open
,vehicle
, &bonnet
和Vehicle
&分别Exhaust
。
- 第1行有一个值
老实说,解决方案是修复您的设计。因此,您的表应该看起来像这样:
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 ">
结尾的记录。