반응형
반응형

적용 대상: 

SQL Server 2016(13.x) 이상

FOR JSON 절의 JSON 출력에 null 값을 포함하려면 INCLUDE_NULL_VALUES 옵션을 지정합니다.

INCLUDE_NULL_VALUES 옵션을 지정하지 않은 경우 JSON 출력은 쿼리 결과에서 null인 값에 대한 속성을 포함하지 않습니다.

예제

다음 예제에는 INCLUDE_NULL_VALUES 옵션을 사용한 경우와 사용하지 않은 경우 FOR JSON 절의 출력이 나와 있습니다.

예제INCLUDE_NULL_VALUES 옵션을 사용하지 않는 경우INCLUDE_NULL_VALUES 옵션을 사용하는 경우

{ "name": "John", "surname": "Doe" } { "name": "John", "surname": "Doe", "age": null, "phone": null }

아래에는 INCLUDE_NULL_VALUES 옵션을 사용한 FOR JSON 절의 다른 예제가 나와 있습니다.

SELECT name, surname  
FROM emp  
FOR JSON AUTO, INCLUDE_NULL_VALUES    
[{
    "name": "John",
    "surname": null
}, {
    "name": "Jane",
    "surname": "Doe"
}] 

 

 

 

docs.microsoft.com/ko-kr/sql/relational-databases/json/include-null-values-in-json-include-null-values-option?view=sql-server-ver15

반응형
반응형

■ 마이그레이션 : SQL Server → PostgreSQL

 

 데이터 타입

 

SQL Server

PostgreSQL

BIGINT

64-bit integer

BIGINT

BINARY(n)

Fixed-length byte string

BYTEA

BIT

1, 0 or NULL

BOOLEAN

CHAR(n), CHARACTER(n)

Fixed-length character string, 1 ⇐ n ⇐ 8000

CHAR(n), CHARACTER(n)

DATE

Date (year, month and day)

DATE

DATETIME

Date and time with fraction

TIMESTAMP(3)

DATETIME2(p)

Date and time with fraction

TIMESTAMP(p)

DATETIMEOFFSET(p)

Date and time with fraction and time zone

TIMESTAMP(p) WITH TIME ZONE

DECIMAL(p,s), DEC(p,s)

Fixed-point number

DECIMAL(p,s), DEC(p,s)

DOUBLE PRECISION

Double-precision floating-point number

DOUBLE PRECISION

FLOAT(p)

Floating-point number

DOUBLE PRECISION

IMAGE

Variable-length binary data, ⇐ 2G

BYTEA

INT, INTEGER

32-bit integer

INT, INTEGER

MONEY

64-bit currency amount

MONEY

NCHAR(n)

Fixed-length Unicode UCS-2 string

CHAR(n)

NTEXT

Variable-length Unicode UCS-2 data, ⇐ 2G

TEXT

NUMERIC(p,s)

Fixed-point number

NUMERIC(p,s)

NVARCHAR(n)

Variable-length Unicode UCS-2 string

VARCHAR(n)

NVARCHAR(max)

Variable-length Unicode UCS-2 data, ⇐ 2G

TEXT

REAL

Single-precision floating-point number

REAL

ROWVERSION

Automatically updated binary data

BYTEA

SMALLDATETIME

Date and time

TIMESTAMP(0)

SMALLINT

16-bit integer

SMALLINT

SMALLMONEY

32-bit currency amount

MONEY

TEXT

Variable-length character data, ⇐ 2G

TEXT

TIME(p)

Time (hour, minute, second and fraction)

TIME(p)

TIMESTAMP

Automatically updated binary data

BYTEA

TINYINT

8-bit unsigned integer, 0 to 255

SMALLINT

UNIQUEIDENTIFIER

16-byte GUID (UUID) data

CHAR(16)

VARBINARY(n)

Variable-length byte string, 1 ⇐ n ⇐ 8000

BYTEA

VARBINARY(max)

Variable-length binary data, ⇐ 2G

BYTEA

VARCHAR(n)

Variable-length character string, 1 ⇐ n ⇐ 8000

VARCHAR(n)

VARCHAR(max)

Variable-length character data, ⇐ 2G

TEXT

XML

XML data

XML

 

 함수

 

SQL Server

PostgreSQL

DATEADD

Add an interval to datetime

INTERVAL expression

ISNULL(exp, replacement)

Replace NULL with the specified value

COALESCE(exp, replacement)

------------------------------------------------------------------------------------------------------------------------



출처: https://icodebroker.tistory.com/6429 [ICODEBROKER]

반응형
반응형

Split 유형의 함수로 구분자로 몇번째 위치의 문자열 가져오기 

-----------------------------------------------------------------------------------------------------------  
--  Split 유형의 함수  
--  문자열에서 구분자(@iSeparator)로 몇번째 단어 가져오기  
--  예: SELECT 데이터베이스명.소유자명.fn_GetIdxDataLikeSplit('가-나-다',2,'-') --> '나'  
-----------------------------------------------------------------------------------------------------------  
-----------------------------------------------------------------------------------------------------------  
-- 프로시저 생성  
-----------------------------------------------------------------------------------------------------------  
ALTER   FUNCTION  [dbo].[fn_GetIdxDataLikeSplit]   
    (  
        @iText          VARCHAR(200),  
        @idx                INT,  
        @iSeparator     VARCHAR(10) = '-'  
    )  
RETURNS  VARCHAR(200)   
AS  
BEGIN  
    DECLARE @wData          VARCHAR(200)  
    DECLARE @wText          VARCHAR(200)  
    DECLARE @wSeparator VARCHAR(10)  
    DECLARE @wNum           INT  
  
    SET @wData          = ''  
    SET @wNum           = 1;  
    SET @wSeparator = LTRIM(RTRIM(@iSeparator));  
    SET @wText          = LTRIM(RTRIM(@iText)) + @wSeparator;   
  
    IF CHARINDEX(@wSeparator, @iText) > 0  
    BEGIN  
        WHILE    @idx >= @wNum  
        BEGIN  
            IF CHARINDEX(@wSeparator, @wText) > 0  
            BEGIN  
                   -- 문자열의 인덱스 위치의 요소를 반환  
                   SET @wData   = SUBSTRING(@wText, 1, CHARINDEX(@wSeparator, @wText) - 1);  
                   SET @wData   = LTRIM(RTRIM(@wData));  
  
                -- 반환된 문자는 버린후 좌우공백 제거     
                    SET @wText  = LTRIM(RTRIM(RIGHT(@wText, LEN(@wText) - (LEN(@wData) + LEN(@iSeparator)))))  
            END   
            ELSE  
            BEGIN  
                    SET @wData  = ''  
            END  
            SET @wNum = @wNum + 1  
        END  
    END  
    ELSE  
    BEGIN  
        SET @wData  = @iText  
    END  
      
      
    RETURN(@wData)  
      
END  

 
반응형

'프로그래밍 > DataBase' 카테고리의 다른 글

[PostgreSql] PostgreSQL의 프로세스 구조  (0) 2021.01.05
쿠팡 데이터 플랫폼의 진화  (0) 2020.12.09
DB Browser for SQLite  (0) 2020.10.21
MSSQL - JSON 데이터 인덱싱  (0) 2020.08.19
oracle foreign key 생성/삭제  (0) 2019.12.26
반응형

MSSQL - JSON 데이터 인덱싱

 

 

https://docs.microsoft.com/ko-kr/sql/relational-databases/json/index-json-data?view=sql-server-ver15

 

JSON 데이터 인덱싱 - SQL Server

JSON 데이터 인덱싱Index JSON data 이 문서의 내용 --> 적용 대상:Applies to: SQL ServerSQL Server(지원되는 모든 버전)SQL ServerSQL Server (all supported versions) Azure SQL DatabaseAzure SQL DatabaseAzure SQL DatabaseAzure SQL Databas

docs.microsoft.com

SQL Server 및 SQL Database에서 JSON은 기본 제공 데이터 형식이 아니며 SQL Server에는 사용자 지정 JSON 인덱스가 없습니다. 그러나 표준 인덱스를 사용하여 JSON 문서에 대한 쿼리를 최적화할 수 있습니다.

데이터베이스 인덱스는 필터 및 정렬 작업의 성능을 향상합니다. 인덱스를 사용하지 않으면 SQL Server는 데이터를 쿼리할 때마다 전체 테이블을 검색해야 합니다.

계산된 열을 사용하여 JSON 속성 인덱싱

SQL Server에 JSON 데이터를 저장하는 경우 JSON 문서 속성 하나 이상을 기준으로 쿼리 결과를 필터링하거나 정렬하는 것이 일반적입니다.

예제

이 예제에서는 AdventureWorks SalesOrderHeader 테이블에 판매 주문에 대한 다양한 정보가 JSON 형식으로 포함되어 있는 Info 열이 있다고 가정합니다. 예를 들어 이 열은 고객, 영업 사원, 배송 및 대금 청구 주소 등에 대한 정보를 포함합니다. Info 열의 값을 사용하여 고객의 판매 주문을 필터링하려고 합니다.

최적화할 쿼리

다음은 인덱스를 사용하여 최적화할 쿼리 형식의 예제입니다.

SQL복사

 

SELECT SalesOrderNumber, OrderDate, JSON_VALUE(Info, '$.Customer.Name') AS CustomerName FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.Name') = N'Aaron Campbell'

예제 인덱스

JSON 문서에서 속성에 대한 ORDER BY 절 또는 필터링의 속도를 향상하려면 다른 열에서 이미 사용 중인 동일한 인덱스를 사용할 수 있습니다. 그러나 JSON 문서에서는 속성을 직접 참조할 수 없습니다.

  1. 먼저 필터링에 사용할 값을 반환하는 “가상 열”을 만들어야 합니다.
  2. 그런 다음 해당 가상 열에 인덱스를 만들어야 합니다.

다음 예제에서는 인덱싱에 사용할 수 있는 계산 열을 만듭니다. 그런 다음 새 계산 열에서 인덱스를 만듭니다. 이 예제에서는 JSON 데이터의 $.Customer.Name 경로에 저장된 고객 이름을 표시하는 열을 만듭니다.

SQL복사

 

ALTER TABLE Sales.SalesOrderHeader ADD vCustomerName AS JSON_VALUE(Info,'$.Customer.Name') CREATE INDEX idx_soh_json_CustomerName ON Sales.SalesOrderHeader(vCustomerName)

계산 열에 대한 자세한 정보

계산 열은 지속형이 아닙니다. 인덱스를 다시 작성해야 하는 경우에만 계산됩니다. 테이블에서 추가 공간을 차지하지 않습니다.

쿼리에서 사용할 동일한 식으로 계산 열을 만드는 것이 중요합니다. 이 예제의 식은 JSON_VALUE(Info, '$.Customer.Name')입니다.

쿼리를 다시 작성할 필요가 없습니다. 위 예제 쿼리와 같이 JSON_VALUE 함수가 포함된 식을 사용하는 경우 SQL Server는 같은 식을 사용하는 동일한 계산 열이 있는지 확인한 후 해당하는 경우 인덱스를 적용합니다.

이 예제에 대한 실행 계획

다음은 이 예제의 쿼리 실행 계획입니다.

SQL Server는 전체 테이블을 검색하지 않고 비클러스터형 인덱스에서 인덱스 검색하여 지정된 조건을 충족하는 행을 찾습니다. 그런 다음 SalesOrderHeader 테이블에서 키 조회를 사용하여 쿼리에서 참조된 다른 열(이 예제에서는 SalesOrderNumber  OrderDate)을 가져옵니다.

포괄 열을 사용하여 추가로 인덱스 최적화

인덱스에 필요한 열을 추가하는 경우 테이블에서 이러한 조회를 추가로 수행할 필요가 없습니다. 위의 CREATE INDEX 예제를 확장하는 다음 예제처럼 이러한 열을 표준형 포괄 열로 추가할 수 있습니다.

SQL복사

 

CREATE INDEX idx_soh_json_CustomerName ON Sales.SalesOrderHeader(vCustomerName) INCLUDE(SalesOrderNumber,OrderDate)

이 경우 비클러스터형 JSON 인덱스에 필요한 모든 사항이 있기 때문에 SQL Server는 SalesOrderHeader 테이블에서 데이터를 추가로 읽을 필요가 없습니다. 이러한 인덱스 유형은 쿼리에서 JSON과 열 데이터를 결합하고 작업에 대한 최적의 인덱스를 생성하기 위한 좋은 방법입니다.

JSON 인덱스는 데이터 정렬 인식 인덱스입니다.

JSON 데이터에 대한 중요한 인덱스 기능은 인덱스의 데이터 정렬 인식 기능입니다. 계산 열을 만들 때 사용하는 JSON_VALUE 함수의 결과는 입력 식에서 데이터 정렬을 상속하는 텍스트 값입니다. 따라서 인덱스의 값은 원본 열에 정의된 데이터 정렬 규칙을 사용하여 정렬됩니다.

인덱스가 데이터 정렬을 인식한다는 것을 보여주기 위해 다음 예제에서는 기본 키와 JSON 콘텐츠가 있는 단순한 컬렉션 테이블을 만듭니다.

SQL복사

 

CREATE TABLE JsonCollection ( id INT IDENTITY CONSTRAINT PK_JSON_ID PRIMARY KEY, json NVARCHAR(MAX) COLLATE SERBIAN_CYRILLIC_100_CI_AI CONSTRAINT [Content should be formatted as JSON] CHECK(ISJSON(json)>0) )

이전 명령은 JSON 열에 대하여 세르비아어 키릴 자모 데이터 정렬을 지정합니다. 다음 예제에서는 테이블을 자동으로 채우고 이름 속성에 대한 인덱스를 만듭니다.

SQL복사

 

INSERT INTO JsonCollection VALUES (N'{"name":"Иво","surname":"Андрић"}'), (N'{"name":"Андрија","surname":"Герић"}'), (N'{"name":"Владе","surname":"Дивац"}'), (N'{"name":"Новак","surname":"Ђоковић"}'), (N'{"name":"Предраг","surname":"Стојаковић"}'), (N'{"name":"Михајло","surname":"Пупин"}'), (N'{"name":"Борислав","surname":"Станковић"}'), (N'{"name":"Владимир","surname":"Грбић"}'), (N'{"name":"Жарко","surname":"Паспаљ"}'), (N'{"name":"Дејан","surname":"Бодирога"}'), (N'{"name":"Ђорђе","surname":"Вајферт"}'), (N'{"name":"Горан","surname":"Бреговић"}'), (N'{"name":"Милутин","surname":"Миланковић"}'), (N'{"name":"Никола","surname":"Тесла"}') GO ALTER TABLE JsonCollection ADD vName AS JSON_VALUE(json,'$.name') CREATE INDEX idx_name ON JsonCollection(vName)

앞의 명령은 JSON $.name 속성의 값을 나타내는 계산 열 vName에 표준 인덱스를 만듭니다. 세르비아어-키릴 자모 코드 페이지에서 문자 순서는 'А', 'Б', 'В', 'Г', 'Д', 'Ђ', 'Е' 등의 순서입니다. JSON_VALUE 함수의 결과는 원본 열에서 데이터 정렬을 상속하므로 인덱스에서 항목의 순서는 세르비아어 키릴 자모 규칙을 따릅니다. 다음 예제에서는 이 컬렉션을 쿼리하고 이름을 기준으로 결과를 정렬합니다.

SQL복사

 

SELECT JSON_VALUE(json,'$.name'),* FROM JsonCollection ORDER BY JSON_VALUE(json,'$.name')

실제 실행 계획을 보면 비클러스터형 인덱스에서 정렬된 값을 사용함을 확인할 수 있습니다.

쿼리에 ORDER BY 절이 있지만 실행 계획은 Sort 연산자를 사용하지 않습니다. JSON 인덱스는 이미 세르비아어 키릴 자모 규칙에 따라 정렬됩니다. 따라서 SQL Server는 결과가 이미 정렬된 비클러스터형 인덱스를 사용합니다.

그러나 ORDER BY 식의 데이터 정렬을 변경하면(예: JSON_VALUE 함수 뒤에 COLLATE French_100_CI_AS_SC 추가) 다른 쿼리 실행 계획이 제공됩니다.

인덱스 값 순서는 프랑스어 데이터 정렬 규칙을 따르지 않으므로 SQL Server는 정렬 결과에 대한 인덱스를 사용할 수 없습니다. 따라서 프랑스어 데이터 정렬 규칙을 사용하여 결과를 정렬하는 정렬 연산자를 추가합니다.

반응형
반응형

[MSSQL] 세로 데이터 가로로 출력 (데이터 한줄로 출력) STUFF, FOR XML PATH


http://ggmouse.tistory.com/127




DECLARE @string AS VARCHAR(1000);

SET @string = '';

 

WITH TABLE_A (NAME) AS (

    SELECT '손꽁쥐' UNION ALL

    SELECT '윤선생' UNION ALL

    SELECT '황박사'

)

 

SELECT @string = NAME + ', ' + @string FROM TABLE_A

SELECT @string AS '가로출력' 




--  

WITH TABLE_A (CLASS, NAME) AS (

    SELECT 'A', '손꽁쥐' UNION ALL

    SELECT 'B', '윤선생' UNION ALL

    SELECT 'A', '황박사'

)

SELECT * FROM

(

    SELECT CLASS, STUFF((SELECT ',' + NAME FROM TABLE_A WHERE CLASS = A.CLASS FOR XML PATH('')), 1, 1, '') AS 'Result'

    FROM TABLE_A AS A

) A

GROUP BY A.CLASS, A.Result


반응형
반응형

Microsoft SQL Server Management Studio Express

SSMSE(Microsoft SQL Server Management Studio Express)는 SQL Server 2005 Express Edition 및 SQL Server 2005 Express Edition with Advanced Services를 관리할 수 있는 사용이 용이한 무료 그래픽 관리 도구입니다.


63비트 다운로드 후 관리자권한 으로 실행. 


https://www.microsoft.com/ko-kr/download/details.aspx?id=8961







.

반응형

+ Recent posts