2013-08-20 87 views
0

我有幾個數據庫,我試圖用相同的SQL代碼在我的網站上查詢。我將通過URL使用的列名/表格傳遞給新頁面。例如:在不知道列類型的情況下將NULL值轉換爲「UNKNOWN」

/some/url.php?table=tableName&c1=ColumnOne&c2=ColumnTwo&c3=ColumnThree&n=3

我有幾個這些URL的所有鏈接到同一頁面(但具有不同的表名和列)。在接下來的頁面中,PHP代碼將是這樣的

for ($j = 1; $j <= $n; $j++) { 
    // Since the number of column variables varies (there could be c1 and c2, or c1 -> c5), you need to save this part of the query in a variable 
    $variables .= ${'c' . $j} . ', '; 
} 

SELECT $variables 
FROM db.dbo.tableName 

所以這3列中的實際查詢將

SELECT ColumnOne, ColumnTwo, ColumnThree 
FROM db.dbo.tableName 

的問題是,一些列的是浮動的,有些是爲nvarchar(254)。在float列中,空值爲0.在nvarchar(254)列中,空值僅爲NULL。我需要nvarchar(254)列中的NULL值爲「UNKNOWN」,浮點列中的0值也是「UNKNOWN」。

這是我的意思的一個例子。 ColumnOne和ColumnTwo是float,而ColumnThree是nvarchar(254)。

--------------------------------------------- 
|ColumnOne |ColumnTwo  |ColumnThree | 
--------------------------------------------- 
|0   |142563  |Insert  | 
--------------------------------------------- 
|1   |348   |Some   | 
--------------------------------------------- 
|2   |2535   |NULL   | 
--------------------------------------------- 
|3   |0    |Value   | 
--------------------------------------------- 
|0   |82536   |NULL   | 
--------------------------------------------- 
|5   |0    |Here   | 
--------------------------------------------- 

這是我想它看起來像

--------------------------------------------- 
|ColumnOne |ColumnTwo  |ColumnThree | 
--------------------------------------------- 
|UNKNOWN  |142563  |Insert  | 
--------------------------------------------- 
|1   |348   |Some   | 
--------------------------------------------- 
|2   |2535   |UNKNOWN  | 
--------------------------------------------- 
|3   |UNKNOWN  |Value   | 
--------------------------------------------- 
|UNKNOWN  |82536   |UNKNOWN  | 
--------------------------------------------- 
|5   |UNKNOWN  |Here   | 
--------------------------------------------- 

我已經試過這

SELECT ISNULL(ColumnOne, 'UNKNOWN'), ISNULL(ColumnTwo, 'UNKNOWN'), ISNULL(ColumnThree, 'UNKNOWN') 
FROM db.dbo.tableName 

不過,我得到這個錯誤:Error converting data type varchar to float

有人可以幫我嗎?這將不勝感激!


編輯:我知道,0值轉換爲UNKNOWN浮法列,我需要做的這

(CASE WHEN ColumnOne = 0 THEN 'UNKNOWN' ELSE CAST(ColumnOne AS varchar(255)) END)

和空值轉換爲UNKNOWN在爲nvarchar(254)列,我需要這樣做

ISNULL(ColumnOne, 'UNKNOWN')

我只是不知道列類型。有沒有辦法做一個CASE語句來檢查列類型,然後使用適當的?

+1

這聽起來像是那種呈現問題,應用程序應該處理,而不是數據庫。 – HABO

回答

2

你不能有沿浮點值在浮動列選字UNKNOWN所有列做到這一點。您需要將所有浮點值轉換爲varchar。轉換後你可以很容易地用其他詞替換0或NULL。

SELECT ISNULL(NULLIF(CAST(ColumnOne AS NVARCHAR(254)),'0'),'UNKNOWN') 
FROM db.dbo.tableName 

(這是第一次用NULL替換全零,然後用「未知」代替所有NULLS - 確保均爲0,且NULL替換)

因爲轉換爲varchar爲varchar會做任何傷害,喲可以對所有列使用相同的語法,如果您不知道哪個是哪個。

SELECT 
    ISNULL(NULLIF(CAST(ColumnOne AS NVARCHAR(254)),'0'),'UNKNOWN') as ColumnOne 
,ISNULL(NULLIF(CAST(ColumnTwo AS NVARCHAR(254)),'0'),'UNKNOWN') as ColumnTwo 
,ISNULL(NULLIF(CAST(ColumnThree AS NVARCHAR(254)),'0'),'UNKNOWN') as ColumnThree 
FROM db.dbo.tableName 

SQLFiddleDEMO

+0

這是行得通的!謝謝! – TFischer

1

您不能在列類型Float中存儲Varchar值。您必須將列類型更改爲varchar以存儲「未知」值。 另外,如果你不想改變列類型,然後擷取你的結果集的浮點值轉換(0)爲varchar,然後替換它與「未知」

select (Case Convert(varchar(500),Column1) when '0' Then 'Unknown' 
when null then 'Unknown' Else Column1 end)Column1 

在這裏,我第一次轉換值爲varchar,然後如果值爲0,則會將其轉換爲Null,然後將Null替換爲'Unknown'

+0

這適用於將float列中的0值轉換爲UNKNOWN,但我不知道列類型,所以我需要一些可以用於這兩種類型的東西。有什麼辦法可以使用CASE語句來確定類型,只能在float列上使用它? – TFischer

+0

我編輯了我的查詢,這將適用於所有的列類型,以及它是0還是Null將它轉換爲'未知' – Sonam

1

您必須將非字符列值轉換爲字符才能使所有可能的輸出值函數將具有相同的類型。使用Str()功能

SELECT ISNULL(Str(ColumnOne, 8,4), 'UNKNOWN'), 
     ISNULL(str(ColumnTwo, 8,4), 'UNKNOWN'), 
     ISNULL(Str(ColumnThree, 8, 4), 'UNKNOWN') 
FROM db.dbo.tableName 

對於那些尚未VARCHAR

相關問題