我想选择逗号前后的值

时间:2018-05-25 09:54:47

标签: sql sql-server

Sql Query用于选择逗号前后的值

有一个名为employee的表,有3个字段..Id,Name,Departmentid 在DepartmentId中,它由3个id 201,301,401组成。

从此想要执行

Select * from employee where DepartmentId =301

5 个答案:

答案 0 :(得分:0)

SELECT * FROM EMPLOYEE WHERE DEPARTMENTID LIKE '%301%'

即使它有效,我也不会真正了解您的数据库设计方式以及您需要逗号的原因

答案 1 :(得分:0)

您可以使用. . . where parsename(replace(DepartmentId, ',', '.'), 2) = 301; 功能:

like

. . . where DepartmentId LIKE '%301%'; 谓词也很有用:

public static void main(String[] a) throws Throwable {
    final String extension = "png";
    final String input = "input1.png";
    final String output = "output1.png";

    final int threadsAmount = 4;

    long startTime = System.currentTimeMillis();
    final Image image = new Image(input, output, extension);

    image.applyMedian(threadsAmount);
    long duration = System.currentTimeMillis() - startTime;
    System.out.println("duration: " + duration);
}

答案 2 :(得分:0)

如果你总是希望匹配中间的数字,这将有效,例如:在你的例子中301

SELECT *
FROM employee
WHERE 
    SUBSTRING ( 
        DepartmentId, 
        CHARINDEX(',', DepartmentId, 0) + 1, 
        CHARINDEX(',', DepartmentId, CHARINDEX(',', DepartmentId, 0) + 1) - CHARINDEX(',', DepartmentId, 0) - 1
    ) = '301'

如果301可以位于该字段中的任何位置,那么您只需使用LIKE

SELECT *
FROM employee
WHERE DepartmentId LIKE '%301%'

答案 3 :(得分:0)

逗号分隔列是反模式。您希望规范部门。

但是,这是一种方法:

select * from employee 
where '301' in (SELECT value FROM STRING_SPLIT(department, ','))

答案 4 :(得分:0)

如果您有像1301或3011这样的部门,那么简单的LIKE可能会失败

请检查以下SQL代码

select * from employees where ','+departmentid+',' like '%,301,%'

其他选项是将departmentid列拆分为每个单独的部门ID值列表

如果您在SQL Server 2016之前有SQL Server,那么您需要自己的客户SQL string split function。 然后您可以使用以下SQL查询

select e.* 
from employees as e
cross apply dbo.split(departmentid,',') as s
where s.val = '301'

如果您正在使用SQL Server 2016或SQL Server 2017,则可以在CROSS APPLY查询中再次使用string_split内置SQL函数

SELECT e.* 
FROM employees as e
    CROSS APPLY STRING_SPLIT(departmentid, ',')
WHERE value = '301'

最后一种方法可以使用SQL XML query将逗号分隔列表修改为XML数据,如下所示

select 
    Id, Name, sqlXML.value('.','varchar(5)') as DepId
from (
    SELECT 
        Id, Name, 
        convert(xml, '<root><t>' + REPLACE(Departmentid, ',', '</t><t>') + '</t></root>') as dlist
    FROM employees
) tbl
CROSS APPLY dlist.nodes('/root/t') as XMLData(sqlXML)
WHERE sqlXML.value('.','varchar(5)') = '301'