sql - 存储过程 WHERE LIKE ID 或 NAME

标签 sql sql-server tsql stored-procedures

集团, 我正在尝试使用一个变量@Customer 创建一个存储过程。我想要做的是在 WHERE 子句中添加一些内容,说明如果它是数字,则搜索 CustomerID 字段,其中输入的数字为 LIKE CustomerID... 如果输入字符,则搜索 CustomerName 字段,其中输入的文本为 LIKE CustomerName。以下是我正在尝试做的事情的示例:

CREATE PROCEDURE [dbo].[uspGetCustomer] (@Customer VARCHAR(100))

AS

SET NOCOUNT ON

SELECT * 
FROM dbo.Customers
WHERE CASE WHEN ISNUMERIC(@Customer) THEN CustomerID LIKE @Customer + '%'
ELSE CustomerName LIKE @Customer + '%' END

有什么建议吗?

最佳答案

我会使用 IF 语句来完成此操作,因为将该逻辑放在 WHERE 中会导致稍后难以阅读:

DECLARE @match = @CustomerID + '%'

IF ISNUMERIC(@CustomerID) = 1 
BEGIN
     SELECT * FROM CUSTOMERS WHERE CustomerID LIKE @match
END ELSE BEGIN
     SELECT * FROM CUSTOMERS WHERE CustomerNAME LIKE @match
END  




更新: 我想知道 CustomerID 字段是否是 INT。如果是这样,那么我会像这样更改查询(并删除 @match 变量):

    ... WHERE CustomerID = Cast(@CustomerID as INT) --if numeric
    ... WHERE CustomerNAME = @CustomerID + '%'      --if not numeric

但是,如果它是一些奇怪的 VARCHAR 字段,以数​​字开头并以其他数据结尾(例如“11_blah”),那么 LIKE 加通配符就可以正常工作

关于sql - 存储过程 WHERE LIKE ID 或 NAME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1903950/

相关文章:

MySQL 如何插入带有 SELECT UNION ALL 和附加参数的表?

mysql 在新数据集上查询太慢 - mariaDB

sql - 如何在不满足条件时显示 NULL

SQL Server 2008 连接两个查询

php - Doctrine - PostgreSQL - 表/字段名称中的大写和空格

php - 不要在 mysql 数据库中复制内容

ios - 在iOS中访问外部SQL数据库

sql-server - SQL Server 2005性能问题

sql-server - 如何设置订单条款

sql-server - 如何将序列号连接到不相关的数据 (SQL Server)