SQL存在以搜索自由文本

时间:2013-10-02 14:35:02

标签: sql sql-server

请参阅下面的DDL:

create table Door_Supervisors (DID int not null, Name varchar(30))
create table general_log (id int not null, Notes varchar(100))
INSERT INTO Door_Supervisors values (1,'ian')
INSERT INTO Door_Supervisors values (2,'Mark')
INSERT INTO General_Log values (1, 'This is a Test 1127678 DID: 000001 DId: 000010')

我想要返回General_Log中提到的所有门监督,即提到1(作为000001)。 256将是:000256。在上述数据的情况下,语句应该返回DID1而不是DID2。我相信我可以使用EXISTS声明。一些变化:

  

SELECT Door_Supervisors。* FROM Door_Supervisors WHERE EXISTS(SELECT   * FROM General_Log WHERE备注LIKE'%DID:'+ RIGHT('000000'+ Door_Supervisors.DID,6)+'%')

3 个答案:

答案 0 :(得分:0)

试试这个:

SELECT Ds.* 
FROM Door_Supervisors ds
JOIN General_log gl on CAST(substring(Notes,6,9) as Int)=ds.did

SQLFiddle:http://www.sqlfiddle.com/#!3/1fb4c/1

请注意,此代码假定注释中的结构化文本是一致的......

答案 1 :(得分:0)

你可以使用它 -

SELECT ds.DID, ds.[Name]
FROM  Door_Supervisors ds
INNER JOIN general_log gl ON  ds.DID = CAST(reverse(left(reverse(gl.notes), charindex(':',reverse(gl.notes), 1) - 1)) AS INT)

SQL Fiddle Demo

答案 2 :(得分:0)

因为你的要求并不完全清楚,所以我对你想要的东西做了一些假设。

  • 您想要从两个表中返回值。
  • 如果您希望将此加入相应门控主管的备注中有6个数字(123456)的模式。

-

SELECT *
FROM   Door_Supervisors
 INNER
  JOIN General_Log
    ON General_Log.Notes LIKE '%' + Right('000000', Cast(Door_Supervisors.DID as varchar(6)), 6) + '%'
WHERE  General_Log.Notes LIKE '%[0-9][0-9][0-9][0-9][0-9][0-9]%'