1

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

选择

第 1 列,第 2 列……第 11 列

桌子

在哪里

Column1 像 'Beatrice%' 或

Column2 像 'Beatrice%' 或...。

Column11 like 'Beatrice%'</p>

是否有一个简短的查询我可以使用像“IN”这样的通配符?

在哪里

'Beatrice%' IN(第 1 列、第 2 列、... 第 11 列)

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

4

2 回答 2

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 全文搜索功能(链接

于 2013-08-23T15:05:25.983 回答
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]

于 2013-08-23T16:19:02.563 回答