查询具有多个“喜欢”的表格,还有另外一种方法吗?

时间:2013-08-23 14:20:49

标签: sql-server-2008

我有11列;我们称之为Column1 ...... ..Column11。假设所有这11列都包含员工姓名。我试图在所有这11列中查找特定记录,但是这里有问题,一些列只有姓氏,一些姓和中间名,一些有姓,中间名拼写,有些有全名。 所以,我试图找到一种更好的方法来查询所有表。 我目前正在做的是:

选择

Column1,Column2 ...... .Column11

其中

Column1喜欢'Beatrice%' OR

Column2喜欢'Beatrice%' OR ...

Column11喜欢'Beatrice%'

我可以使用简短的查询,例如“IN”和外卡吗?

其中

'Beatrice%'IN(Column1,Column2,... Column11)

我知道这个查询不起作用,但我想知道是否有更短的方法来查询表而不必使用11个“喜欢”11列

2 个答案:

答案 0 :(得分:1)

您可以尝试以下构造:

select distinct Column1, Column2, Column3, ...
from [Table]
    cross apply (values (Column1), (Column2), (Column3), ...) col(Value)
where col.Value like 'Beatrice%'

select Column1, Column2, Column3, ...
from [Table]
where exists (
    select 1 from (values (Column1), (Column2), (Column3), ...) col(Value)
    where col.Value like 'abc%'
)

您也可以考虑使用SqlServer全文搜索功能(link

答案 1 :(得分:0)

更重要的是,这是规范化数据库的好时机。您有重复的列,这总是使查询变得困难。假设你有一个employee表:

CREATE TABLE [employee] (
    id INT IDENTITY PRIMARY KEY,
    first_name VARCHAR(20),
    middle_initial CHAR(1),
    surname VARCHAR(20)
)

现在假设您的[table],我将重命名[project],如下所示:

CREATE TABLE [project] (
    id INT IDENTITY PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    supervisor_id INT FOREIGN KEY REFERENCES [employee](id)
)

最后,为了表达项目有员工的事实,添加一个链接表:

CREATE TABLE [project_employee] (
    project_id INT REFERENCES [project](id),
    employee_id INT REFERENCES [employee](id)
)

现在,对像%beatrice%这样的员工的项目的查询只涉及联接和没有工会的单个员工。实际上,SQL Server支持计算列,因此将计算列full_name添加到[employee]表,然后您会得到如下查询:

SELECT p.name, e.full_name
FROM project p
JOIN project_employee pe ON p.id = pe.project_id
JOIN employee e ON pe.employee_id = e.id
WHERE e.full_name LIKE '%beatrice%';

是的,我知道我的语法错了,但我希望你能理解。标准化数据库,或继续用联合编写查询。

此外,您需要做的是您的员工Jane Doe与Richard Roe结婚并取其丈夫的名字,成为Jane Roe?使用当前数据库,您需要在表的所有列中搜索Jane Doe并更新它们。重新规范化,它只是更新[employee]表中的一行。