programing

SQL LIKE 문에서 변수 사용

lovejava 2023. 7. 13. 20:13

SQL LIKE 문에서 변수 사용

다음과 같은 LIKE 클로스에 대한 변수를 취할 저장 프로시저(MSSQL 2k5)가 있습니다.

DECLARE @SearchLetter2 char(1)
SET @SearchLetter = 't'
SET @SearchLetter2 = @SearchLetter + '%'
SELECT *
    FROM BrandNames 
    WHERE [Name] LIKE @SearchLetter2 and IsVisible = 1 
    --WHERE [Name] LIKE 't%' and IsVisible = 1 
    ORDER BY [Name]

안타깝게도 현재 실행 중인 줄은 구문 오류를 발생시키는 반면 주석이 달린 where 절은 정상적으로 실행됩니다.아무도 언급하지 않은 라인이 작동하도록 도와줄 수 있나요?

저장 프로시저를 사용하는 경우:

ALTER PROCEDURE <Name>
(
    @PartialName VARCHAR(50) = NULL
)

SELECT Name 
    FROM <table>
    WHERE Name LIKE '%' + @PartialName + '%'

Joel은 @Search Letter가 아직 선언되지 않았다는 것입니까?또한 @SearchLetter2의 길이가 't%'에 충분하지 않습니다.길이가 더 긴 막대 모양을 사용해 보십시오.

앤드류 브라우어의 말처럼, 하지만 트림을 추가하는 것은

ALTER PROCEDURE <Name>
(
    @PartialName VARCHAR(50) = NULL
)

SELECT Name 
    FROM <table>
    WHERE Name LIKE '%' + LTRIM(RTRIM(@PartialName)) + '%'

하지만 제 생각에 한 가지 중요한 것이 있습니다.

"문자(숫자)"는 변수의 길이입니다.

예를 들어 [테스트1]과 같이 "이름"이 있는 테이블이 있는 경우.Test200] 그리고 다음과 같이 SELECT에 char(5)를 선언합니다.

DECLARE @variable char(5)
SET @variable = 'Test1%'
SELECT * FROM table WHERE Name like @variable

결과는 - "테스트 1"!(문자(5) - 5자, 테스트 11은 6)만 됩니다.

[테스트11]과 같은 잠재적인 관심 데이터의 나머지.Test200]은(는) 결과에 반환되지 않습니다.

이렇게 해서 SELECT를 제한하고 싶어도 괜찮습니다.그러나 의도적인 방법이 아닐 경우 계획된 결과에서 잘못된 결과가 반환될 수 있습니다(예: "테스트 1로 시작하는 모든 이름...").

제 생각에는 선택한 값의 정확한 길이를 모르는 경우 더 나은 해결책이 다음과 같은 방법일 수 있습니다.

DECLARE @variable varchar(max)
SET @variable = 'Test1%'
SELECT * FROM <table> WHERE variable1 like @variable

이것은 반환됩니다(테스트 1 및 테스트 11).테스트 19 및 테스트 100..테스트 199).

이것은 Northwind 샘플 DB에서 사용할 수 있습니다. Search Letter에는 두 개의 문자가 있으며 Search Letter를 실행하려면 다음과 같이 선언해야 합니다.

declare @SearchLetter2 char(2)
declare @SearchLetter char(1)
Set @SearchLetter = 'A'
Set @SearchLetter2 = @SearchLetter+'%'
select * from Customers where ContactName like @SearchLetter2 and Region='WY'

선언 @검색 편지 2문자(1)

이 문자를 더 긴 문자로 설정합니다.

우리는 직접적으로 쓸 수도 있습니다...

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' 

SELECT * 
FROM   CUSTOMERS 
WHERE  CONTACTNAME LIKE @SearchLetter + '%' 
       AND REGION = 'WY' 

또는 모든 검색 문자를 추가해야 하는 경우에도 다음과 같은 방법으로.

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' + '%' 

SELECT * 
FROM   CUSTOMERS 
WHERE  CONTACTNAME LIKE @SearchLetter 
       AND REGION = 'WY' 

이 두 가지 모두 작동합니다.

LIKE에서 로컬 변수를 사용하는 것도 문제가 있었습니다.
중요한 것은 얼마나 오랫동안 변수가 되는지 아는 입니다.
아래에서 ORDER_NO50자이므로 LIKE @ORDER_NO를 사용할 수 없습니다. 마지막에 공백이 있기 때문입니다.
먼저 변수의 오른쪽을 잘라야 합니다.
다음과 같이:

DECLARE @ORDER_NO char(50)
SELECT @ORDER_NO = 'OR/201910/0012%'

SELECT * FROM orders WHERE ord_no LIKE RTRIM(@ORDER_NO)

저도 비슷한 문제에 부딪혔습니다.데이터베이스에 저장된 URL 중 앞부분과 끝부분이 관련이 없는 부분만 사용해야 했습니다.

처음에는 다음을 사용하려고 했습니다.

DECLARE @variable VARCHAR(250) = %x%;
SELECT * FROM tblone WHERE column1 LIKE '@variable'

그러나 다음 오류가 반환되었습니다.

숫자를 데이터 형식 varchar로 변환하는 중 산술 오버플로 오류가 발생했습니다.

작업 쿼리 형식이 지정되었습니다.

DECLARE @variable VARCHAR(1000) = x;
SELECT * FROM tblone WHERE column1 LIKE '%'+@variable+'%'

그것은 매우 간단할 것입니다.LIKE '%%[%3]%%'[%3]입력 변수

SAP B19.1에서 사용할 수 있습니다.

사용할 수도 있습니다.CONCAT()다음과 같이:

SET @variable='some_value';                                                        
SELECT * FROM table_name WHERE column_name LIKE (SELECT CONCAT('%',@variable,'%'));

언급URL : https://stackoverflow.com/questions/390362/using-variable-in-sql-like-statement