在我目前正在進行的這個專案中(我正在建立一個桌面應用程式和一個新的電子商店之間的橋梁)有一個產品表,其中定義了一些備用列,可以用于最終用戶可能需要的任何原因要存盤的一些自定義資料。
所以,用戶需要設定一個真/假標志來確定產品是否會出現在三個不同的滑塊中......不幸的是,實作這一點的人甚至沒有使用相同型別的備用列......所以,
- Slider1 的標志存盤在
varchar(50)列中 - Slider2 的標志存盤在
float列中 - Slider3 的標志存盤在
float列中
此外,我SELECT DISTINCT <column>為每一個都運行了一個,以了解存盤在每列中的實際資料,并得到以下結果:
- 該
varchar列中存盤了以下資料:
| FLDSTRING1 |
|---|
| 空值 |
| '' |
| 0 |
| 1 |
| 194276400456 |
- 該
float列存盤了以下資料:
| FLDFLOAT5 |
|---|
| 空值 |
| 0 |
| 1 |
- 另一
float列有這個:
| FLDFLOAT6 |
|---|
| 空值 |
| 1 |
此外,我運行以下查詢以查找為每列存盤的資料的不同組合:
SELECT FLDSTRING1, FLDFLOAT5, FLDFLOAT6
FROM MATERIAL
GROUP BY FLDSTRING1, FLDFLOAT5, FLDFLOAT6
并得到以下組合...
| FLDSTRING1 | FLDFLOAT5 | FLDFLOAT6 |
|---|---|---|
| 空值 | 空值 | 空值 |
| 空值 | 空值 | 1 |
| 空值 | 0 | 空值 |
| 空值 | 1 | 空值 |
| 空值 | 1 | 1 |
| '' | 空值 | 空值 |
| '' | 空值 | 1 |
| 0 | 空值 | 空值 |
| 0 | 0 | 空值 |
| 1 | 空值 | 空值 |
| 1 | 空值 | 1 |
| 1 | 0 | 空值 |
| 1 | 1 | 空值 |
| 1 | 1 | 1 |
| 194276400456 | 0 | 空值 |
在所有這些介紹之后我需要什么......
我想要一個像這樣的三個逗號分隔值的連接字串
NEWPROD因為什么時候FLDSTRING1會評估為true- 任何非 NULL、0 或 ''CUSTOM1因為什么時候FLDFLOAT5會評估為true- 基本上是值 1CUSTOM2因為什么時候FLDFLOAT6會評估為true- 再次值 1
After some trial and error I managed to bring this to a point that it kind of works, in the sense that it brings the correct values, not comma-separated though...
SELECT
FLDSTRING1, FLDFLOAT5, FLDFLOAT6,
CONCAT(CASE WHEN ISNULL(FLDSTRING1, '') = '' THEN '' ELSE 'NEWPROD' END,
CASE WHEN ISNULL(FLDFLOAT5, '') = '' THEN '' ELSE 'CUSTOM1' END,
CASE WHEN ISNULL(FLDFLOAT6, '') = '' THEN '' ELSE 'CUSTOM2' END) AS TAGS
FROM
MATERIAL
GROUP BY
FLDSTRING1, FLDFLOAT5, FLDFLOAT6;
| FLDSTRING1 | FLDFLOAT5 | FLDFLOAT6 | TAGS |
|---|---|---|---|
| NULL | NULL | NULL | |
| NULL | NULL | 1 | CUSTOM2 |
| NULL | 0 | NULL | |
| NULL | 1 | NULL | CUSTOM1 |
| NULL | 1 | 1 | CUSTOM1CUSTOM2 |
| '' | NULL | NULL | |
| '' | NULL | 1 | CUSTOM2 |
| 0 | NULL | NULL | NEWPROD |
| 0 | 0 | NULL | NEWPROD |
| 1 | NULL | NULL | NEWPROD |
| 1 | NULL | 1 | NEWPRODCUSTOM2 |
| 1 | 0 | NULL | NEWPROD |
| 1 | 1 | NULL | NEWPRODCUSTOM1 |
| 1 | 1 | 1 | NEWPRODCUSTOM1CUSTOM2 |
| 194276400456 | 0 | NULL | NEWPROD |
Problem #1 is I don't quite understand how this works... I mean, value 0 isn't '', but still for the combination of NULL 0 NULL I get an empty value, which is what I wanted... But how does it do that?
And also, can someone update my final query to comma-separate the calculated TAGS column? Problem #2 is that I don't want it to contain just two commas, like ,,, when the combination wouldn't justify any of the three values to appear... It should work like PHP's implode() works...
To help you help me with this, I'm including a fiddle with the setup of the scenario I describe here... Thanks in advance!
uj5u.com熱心網友回復:
由于您使用的是 SQL Server 2014,因此CONCAT_WS您可以嘗試STUFF如下所示。通過,在所有字串之前添加分隔符,STUFF將洗掉找到的第一個逗號。
SELECT
FLDSTRING1,
FLDFLOAT5,
FLDFLOAT6,
STUFF(
CONCAT(
CASE WHEN FLDSTRING1 IS NULL OR FLDSTRING1 IN ('0','') THEN '' THEN '' ELSE ',NEWPROD' END,
CASE WHEN FLDFLOAT5 IS NULL THEN '' ELSE ',CUSTOM1' END,
CASE WHEN FLDFLOAT6 IS NULL THEN '' ELSE ',CUSTOM2' END
),
1,1,''
) AS TAGS
FROM @MATERIAL
GROUP BY FLDSTRING1, FLDFLOAT5, FLDFLOAT6;
查看作業演示資料庫小提琴
讓我知道這是否適合您。
uj5u.com熱心網友回復:
使用該CONCAT_WS()函式將值連接到逗號(或其他分隔符)分隔的串列中,該串列忽略 nulls。
要使用CONCAT_WS(),NULL如果值為“空白”(根據您的定義),您希望將其傳遞給 true ,否則您的自定義標簽:
SELECT DISTINCT
FLDSTRING1,
FLDFLOAT5,
FLDFLOAT6,
CONCAT_WS(',',
CASE WHEN FLDSTRING1 IS NULL OR FLDSTRING1 = '' OR FLDSTRING1 = '0' THEN NULL ELSE 'NEWPROD' END,
CASE WHEN FLDFLOAT5 IS NULL OR FLDFLOAT5 = 0 THEN NULL ELSE 'CUSTOM1' END,
CASE WHEN FLDFLOAT6 IS NULL OR FLDFLOAT6 = 0 THEN NULL ELSE 'CUSTOM2' END) AS TAGS
FROM MATERIAL
替換GROUP BY為DISTINCT因為它更簡單并且(此處)實作了相同的目的。
如果CONCAT_WS不可用:
SELECT DISTINCT
FLDSTRING1,
FLDFLOAT5,
FLDFLOAT6,
REPLACE(REPLACE(REPLACE(CONCAT(
CASE WHEN FLDSTRING1 IS NULL OR FLDSTRING1 = '' OR FLDSTRING1 = '0' THEN 'X' ELSE 'NEWPROD' END,
',',
CASE WHEN FLDFLOAT5 IS NULL OR FLDFLOAT5 = 0 THEN 'X' ELSE 'CUSTOM1' END,
',',
CASE WHEN FLDFLOAT6 IS NULL OR FLDFLOAT6 = 0 THEN 'X' ELSE 'CUSTOM2' END
), ',X', ''), 'X,', ''), 'X', '') AS TAGS
FROM MATERIAL
見dbfiddle。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/325114.html
標籤:sql sql-server tsql sql-server-2014
上一篇:如何添加參考不同表的約束
